【发布时间】:2021-06-16 19:22:12
【问题描述】:
我遇到了一个错误
redis.exceptions.ConnectionError: Error 24 connecting to redis-service:6379. Too many open files.
...
OSError: [Errno 24] Too many open files
我知道这可以通过增加ulimit 来解决,但我认为这不是问题所在,而且这是在容器上运行的服务。
应用程序正确启动 48 小时后正常工作,然后出现上述错误。
这意味着连接随着时间呈指数增长。
我的应用程序基本上在做什么
- background_task(使用 celery 运行)-> 从 postgres 收集数据并将其设置在 redis 上
- prometheus 在 '/metrics' 处到达应用程序,这是一个 django 视图 -> 从 redis 收集数据并使用 django prometheus exporter 提供数据
代码看起来像这样
views.py
from prometheus_client.core import GaugeMetricFamily, REGISTRY
from my_awesome_app.taskbroker.celery import app
class SomeMetricCollector:
def get_sample_metrics(self):
with app.connection_or_acquire() as conn:
client = conn.channel().client
result = client.get('some_metric_key')
return {'some_metric_key': result}
def collect(self):
sample_metrics = self.get_sample_metrics()
for key, value in sample_metrics.items():
yield GaugeMetricFamily(key, 'This is a custom metric', value=value)
REGISTRY.register(SomeMetricCollector())
tasks.py
# This is my boilerplate taskbroker app
from my_awesome_app.taskbroker.celery import app
# How it's collecting data from postgres is trivial to this issue.
from my_awesome_app.utility_app.utility import some_value_calculated_from_query
@app.task()
def app_metrics_sync_periodic():
with app.connection_or_acquire() as conn:
client = conn.channel().client
client.set('some_metric_key', some_value_calculated_from_query(), ex=21600)
return True
我认为 tasks.py 中的后台数据收集不会导致 Redis 连接呈指数增长,但这是导致 views.py 中的 Django 视图 '/metrics' 的原因。
你能告诉我我在这里做错了什么吗?
如果有更好的方法从 Django 视图中读取 Redis。 Prometheus 实例每隔5s 抓取一次 Django 应用程序。
【问题讨论】:
标签: python django redis celery prometheus