| 842 | import gunicorn.app.base |
| 843 | |
| 844 | class FeastServeApplication(gunicorn.app.base.BaseApplication): |
| 845 | def __init__( |
| 846 | self, store: "feast.FeatureStore", metrics_enabled: bool = False, **options |
| 847 | ): |
| 848 | self._app = get_app( |
| 849 | store=store, |
| 850 | registry_ttl_sec=options["registry_ttl_sec"], |
| 851 | ) |
| 852 | self._options = options |
| 853 | self._metrics_enabled = metrics_enabled |
| 854 | super().__init__() |
| 855 | |
| 856 | def load_config(self): |
| 857 | for key, value in self._options.items(): |
| 858 | if key.lower() in self.cfg.settings and value is not None: |
| 859 | self.cfg.set(key.lower(), value) |
| 860 | |
| 861 | self.cfg.set("worker_class", "uvicorn_worker.UvicornWorker") |
| 862 | if self._metrics_enabled: |
| 863 | self.cfg.set("post_worker_init", _gunicorn_post_worker_init) |
| 864 | self.cfg.set("child_exit", _gunicorn_child_exit) |
| 865 | |
| 866 | def load(self): |
| 867 | return self._app |
| 868 | |
| 869 | def _gunicorn_post_worker_init(worker): |
| 870 | """Start per-worker resource monitoring after Gunicorn forks.""" |