运行 Celery 任务的 Docker 容器的健康检查?

问题描述 投票:0回答:6

我知道检查 Docker 容器运行状况的方法之一是使用命令

HEALTHCHECK CMD curl --fail http://localhost:3000/ || exit 1

但是如果是工人,则没有这样的 URL 可以点击,在这种情况下如何检查容器的健康状况?

docker celery
6个回答
43
投票

celery inspect ping
命令派上用场,因为它完成了整个行程:它在代理上发送“ping”任务,工作人员响应,celery 获取响应。

假设您的应用程序名为

tasks.add
,您可以 ping 所有工作人员:

/app $ celery inspect ping -A tasks.add
-> celery@aa7c21dd0e96: OK
        pong
-> celery@57615db15d80: OK
        pong

其中

aa7c21dd0e96
是 Docker 主机名,因此可在
$HOSTNAME
中使用。

要 ping 单个节点,您必须运行:

celery inspect ping -A tasks.add -d celery@$HOSTNAME

这里,d代表目的地

添加到 Dockerfile 的行:

HEALTHCHECK CMD celery inspect ping -A tasks.add -d celery@$HOSTNAME

输出示例:

/app $ celery inspect ping -A tasks.add -d fake_node
Error: No nodes replied within time constraint.
/app $ echo $?
69

如果节点不存在或不回复则不健康

/app $ celery inspect ping -A tasks.add -d celery@$HOSTNAME
-> celery@d39b3d31cc13: OK
        pong
/app $ echo $?
0

节点回复时健康

pong

/app $ celery inspect ping -d celery@$HOSTNAME
Traceback (most recent call last):
...
    raise socket.error(last_err)
OSError: [Errno 111] Connection refused
/app $ echo $?
1

代理不可用时不健康 - 我删除了该应用程序,因此它尝试连接到本地 AMPQ 但失败 这可能不适合您的需求,经纪人不健康,而不是工人。


12
投票

下面的示例片段源自 @PunKeel 发布的内容,适用于那些希望在

docker-compose.yml
中实施健康检查的人,可以通过
docker-compose
docker stack deploy
使用。

worker:
    build:
        context: .
        dockerfile: Dockerfile
    image: myimage
    links:
        - rabbitmq
    restart: always
    command: celery worker --hostname=%h --broker=amqp://rabbitmq:5672
    healthcheck:
        test: celery -b amqp://rabbitmq:5672 inspect ping -d celery@$$HOSTNAME
        interval: 30s
        timeout: 10s
        retries: 3

请注意命令中额外的

$
,以便
$HOSTNAME
实际上被传递到容器中。我也没有使用
-A
标志。

理想情况下,rabbitmq 也应该有自己的健康检查,也许使用

rabbitmqctl status
,因为 docker 将无法通过
celery inspect ping
辨别工人是否宕机或代理是否宕机。

-- 编辑:

另请查看

SomeGuyOnAComputer
提供的解决方案 使用
kill -0 $PID
检查 PID 是否处于活动状态。


7
投票

对于 celery 5.2.3,我使用

celery -A [celery app name] status
进行健康检查。这就是我的 docker-compose 文件的样子

worker:
      build: .
      healthcheck:
        test: celery -A app.celery_app status
        interval: 10s
        timeout: 10s
        retries: 10
      volumes:
          - ./app:/app
      depends_on:
        - broker
        - redis
        - database

1
投票

在这个问题上寻找 Celery 工作人员的健康检查作为 Airflow 设置的一部分(Airflow 2.3.4,Celery 5.2.7),我最终弄清楚了。这是原始问题的一个非常具体的用例,但可能对某些人仍然有用:

# docker-compose.yml

  worker:
      image: ...
      hostname: local-worker
      entrypoint: airflow celery worker
      ...
      healthcheck:
        test: [ "CMD-SHELL", 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"' ]
        interval: 5s
        timeout: 10s
        retries: 10
      restart: always
      ...

我从 Airflow 的快速启动 Docker Compose 中获得了灵感。


1
投票

为运行 Celery 任务的 Docker 容器配置 HEALTHCHECK 并确保另一个容器依赖于其健康状态:

在您的 Docker Compose 文件中:

version: "3.8"
services:
  celery:
    # Celery container config
    healthcheck:
      test: celery inspect ping
      interval: 1m
      timeout: 10s
      retries: 10
      start_period: 1m

  dependent_container:
    # Dependent container config
    depends_on:
      celery:
        condition: service_healthy

这将使用

celery
celery inspect ping
容器设置运行状况检查。
dependent_container
取决于
celery
condition: service_healthy
,确保仅当
celery
健康时才启动。


0
投票

就这么简单:

...
healthcheck:
    test: sh -c 'celery -A your_celery_module inspect ping'
    ...

您的日志文件将有类似的 ping 日志:

[2023-05-05 11:18:47,309: DEBUG/MainProcess] pidbox 收到方法 ping() [reply_to:{'exchange': 'reply.celery.pidbox', 'routing_key': '8195241f-122a-3dc4-9841-739f55804b82'}票证:bada7609-ce6b-499a-b3c2-c80911e0fe09]

此外,您可能想在已经运行的容器中亲自检查它。在这种情况下,它会看起来像这样:

celery ping output

© www.soinside.com 2019 - 2024. All rights reserved.