Some checks failed
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 10s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (push) Successful in 1m45s
CI / openapi-codegen-check (pull_request) Successful in 1m43s
CI / backend-tests (push) Failing after 8m36s
CI / backend-tests (pull_request) Failing after 8m36s
Имплементация фиксов 2-го аудита backend/app/** (после merge #1543). Воркер на файл, точечные правки. Верификация: py_compile 58/58 .py. Полностью исправлено (82). Оставлены открытыми (13): partial/needs-cross-file/needs-leha — #1569, #1590, #1593, #1606, #1609, #1617, #1633, #1635, #1637, #1638, #1640, #1642, #1650. Closes #1560 Closes #1561 Closes #1562 Closes #1563 Closes #1564 Closes #1565 Closes #1566 Closes #1567 Closes #1570 Closes #1571 Closes #1572 Closes #1573 Closes #1574 Closes #1576 Closes #1577 Closes #1578 Closes #1579 Closes #1580 Closes #1581 Closes #1582 Closes #1583 Closes #1584 Closes #1585 Closes #1586 Closes #1587 Closes #1588 Closes #1589 Closes #1591 Closes #1592 Closes #1594 Closes #1595 Closes #1596 Closes #1597 Closes #1598 Closes #1599 Closes #1600 Closes #1601 Closes #1602 Closes #1603 Closes #1604 Closes #1605 Closes #1607 Closes #1608 Closes #1610 Closes #1611 Closes #1612 Closes #1613 Closes #1614 Closes #1615 Closes #1616 Closes #1618 Closes #1619 Closes #1620 Closes #1621 Closes #1622 Closes #1623 Closes #1624 Closes #1625 Closes #1626 Closes #1627 Closes #1628 Closes #1629 Closes #1630 Closes #1631 Closes #1632 Closes #1634 Closes #1636 Closes #1639 Closes #1641 Closes #1643 Closes #1644 Closes #1645 Closes #1646 Closes #1647 Closes #1648 Closes #1649 Closes #1651 Closes #1652 Closes #1653 Closes #1654 Closes #1655 Closes #1656
94 lines
3.7 KiB
Python
94 lines
3.7 KiB
Python
"""Celery app — single source of truth для Celery configuration.
|
|
|
|
Beat schedule build → app/workers/beat_schedule.py.
|
|
Worker lifecycle hooks (process_init, worker_ready) → app/workers/lifecycle.py.
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
|
|
import sentry_sdk
|
|
from celery import Celery
|
|
from sentry_sdk.integrations.celery import CeleryIntegration
|
|
from sentry_sdk.integrations.httpx import HttpxIntegration
|
|
from sentry_sdk.integrations.logging import LoggingIntegration
|
|
from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
|
|
|
|
from app.core.config import settings
|
|
from app.observability.sentry_scrub import scrub_sensitive_query
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# SDK инициализируется в обоих процессах (FastAPI-сервер и Celery-воркер),
|
|
# чтобы события из тасков попадали в GlitchTip. SDK безопасен для двойного
|
|
# вызова — повторный sentry_sdk.init() в одном процессе заменяет клиента.
|
|
if settings.glitchtip_dsn:
|
|
sentry_sdk.init(
|
|
dsn=settings.glitchtip_dsn,
|
|
environment=settings.environment,
|
|
release=os.getenv("GIT_SHA") or os.getenv("SENTRY_RELEASE") or "unknown",
|
|
traces_sample_rate=settings.glitchtip_traces_sample_rate,
|
|
profiles_sample_rate=0.0,
|
|
send_default_pii=False,
|
|
before_send_transaction=scrub_sensitive_query,
|
|
integrations=[
|
|
CeleryIntegration(monitor_beat_tasks=True),
|
|
SqlalchemyIntegration(),
|
|
HttpxIntegration(),
|
|
LoggingIntegration(level=logging.INFO, event_level=logging.ERROR),
|
|
],
|
|
)
|
|
logger.info(
|
|
"GlitchTip SDK initialised in Celery worker (env=%s)",
|
|
settings.environment,
|
|
)
|
|
|
|
celery_app = Celery(
|
|
"gendesign",
|
|
broker=settings.redis_url,
|
|
backend=settings.redis_url,
|
|
include=[
|
|
"app.workers.tasks.scrape_kn",
|
|
"app.workers.tasks.scrape_kn_catalog_objects",
|
|
"app.workers.tasks.refresh_analytics",
|
|
"app.workers.tasks.scrape_objective",
|
|
"app.workers.tasks.objective_etl",
|
|
"app.workers.tasks.nspd_geo",
|
|
"app.workers.tasks.nspd_sync",
|
|
"app.workers.tasks.poi_sync",
|
|
"app.workers.tasks.noise_sync",
|
|
"app.workers.tasks.pzz_sync",
|
|
"app.workers.tasks.scrape_cadastre",
|
|
"app.workers.tasks.ekburg_permits_sync",
|
|
"app.workers.tasks.cbr_macro_sync",
|
|
"app.workers.tasks.rosstat_macro_sync",
|
|
"app.workers.tasks.refresh_quarter_price_index",
|
|
"app.workers.tasks.etl_newbuilding_crossload",
|
|
"app.workers.tasks.supply_layers_refresh",
|
|
"app.workers.tasks.location_refresh",
|
|
"app.workers.tasks.forecast",
|
|
"app.workers.tasks.ird_harvest",
|
|
"app.workers.tasks.ekb_krt_sync",
|
|
"app.workers.tasks.gknspecial_harvest",
|
|
"app.workers.tasks.opportunity_harvest",
|
|
"app.workers.tasks.planning_harvest",
|
|
"app.workers.tasks.zone_regulation_refresh",
|
|
"app.workers.tasks.reservation_ingest",
|
|
"app.workers.tasks.genplan_zones_sync",
|
|
"app.workers.tasks.ekb_ppt_tep_sync",
|
|
"app.workers.tasks.krt_geometry_sync",
|
|
"app.workers.tasks.okn_objects_sync",
|
|
"app.workers.tasks.pat_subzones_load",
|
|
"app.workers.tasks.izyatie_ocr_ingest",
|
|
"app.workers.tasks.developer_registry_refresh",
|
|
],
|
|
)
|
|
celery_app.conf.timezone = "Europe/Moscow"
|
|
|
|
# Apply beat schedule (DB → fallback → hardcoded entries)
|
|
from app.workers.beat_schedule import build_beat_schedule # noqa: E402
|
|
|
|
celery_app.conf.beat_schedule = build_beat_schedule()
|
|
|
|
# Register lifecycle hooks (import for side-effect — signal decorator registration)
|
|
from app.workers import lifecycle # noqa: E402, F401
|