Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ Looking for the containers? [Head over to the Github Container Registry](https:/
* [PRE_START_PATH](#pre_start_path)
* [RELOAD](#reload)
* [RELOAD_SIGINT_TIMEOUT](#reload_sigint_timeout)
* [OTEL_ENABLED](#otel_enabled)
* [Python Versions](#python-versions)
* [Image Variants](#image-variants)
* [Full](#full)
Expand Down Expand Up @@ -240,6 +241,10 @@ When `RELOAD` is set this value determines how long to wait for the worker to gr

Defaults to 30 seconds.

### `OTEL_ENABLED`

When set to `true` the container will enable OpenTelemetry (OTel) instrumentation for the Celery worker. This is done by installing the `opentelemetry-distro` and `opentelemetry-exporter-otlp` packages at startup and enabling auto-instrumentation. Any additional instrumentation packages (e.g. `opentelemetry-instrumentation-celery`) must be installed separately.

## Python Versions

This project actively supports these Python versions:
Expand Down
10 changes: 8 additions & 2 deletions assets/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,23 @@ fi
# End of tiangolo/gunicorn-uvicorn-docker block
#

if [[ "$OTEL_ENABLED" == "true" ]]; then
OTEL_CMD="opentelemetry-instrument"
echo "OpenTelemetry auto-instrumentation enabled"
else
OTEL_CMD=""
fi

if [[ "$ENABLE_BEAT" == "true" ]]; then
COMMAND="python -m celery -A $APP_MODULE beat -s /var/celery/celerybeat-schedule"
COMMAND="$OTEL_CMD python -m celery -A $APP_MODULE beat -s /var/celery/celerybeat-schedule"
else
POOL=${POOL:-prefork}
if [[ "$POOL" = "gevent" ]] || [[ "$POOL" = "eventlet" ]] ; then
CONCURRENCY=${CONCURRENCY:-100}
else
CONCURRENCY=${CONCURRENCY:-2}
fi
COMMAND="python -m celery -A $APP_MODULE worker \
COMMAND="$OTEL_CMD python -m celery -A $APP_MODULE worker \
--pool=$POOL \
--concurrency=$CONCURRENCY \
--prefetch-multiplier=${PREFETCH_MULTIPLIER:-4}"
Expand Down
10 changes: 10 additions & 0 deletions dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
ARG python_version=3.9
ARG build_target=$python_version
ARG publish_target=$python_version
ARG OTEL_ENABLED=false

FROM python:$build_target as Builder

Expand All @@ -9,6 +10,7 @@ ARG build_target
ARG package
ARG package_version
ARG TARGETPLATFORM
ARG OTEL_ENABLED

# Only add build tools for alpine image. The ubuntu based images have build tools already.
# Only runs if `apk` is on the system.
Expand All @@ -26,6 +28,9 @@ ENV PATH="/root/.cargo/bin:${PATH}"
RUN bash -c 'if [[ "$TARGETPLATFORM" == "linux/arm/v7" ]] ; then pip install $package==$package_version ; fi'
RUN bash -c 'if [[ "$TARGETPLATFORM" != "linux/arm/v7" ]] ; then pip install $package==$package_version watchfiles>=0.15 ; fi'

# Install OpenTelemetry packages if enabled.
RUN bash -c 'if [[ "$OTEL_ENABLED" == "true" ]] ; then pip install opentelemetry-distro opentelemetry-exporter-otlp && opentelemetry-bootstrap -a install ; fi'


# Build our actual container now.
FROM python:$publish_target
Expand All @@ -36,9 +41,11 @@ ARG python_version
ARG package
ARG maintainer=""
ARG TARGETPLATFORM=""
ARG OTEL_ENABLED=false
LABEL python=$python_version
LABEL package=$package
LABEL maintainer=$maintainer
LABEL otel_enabled=$OTEL_ENABLED
LABEL org.opencontainers.image.description="python:$publish_target $package:$package_version $TARGETPLATFORM"

# Used for Celery Beat.
Expand All @@ -48,6 +55,9 @@ RUN mkdir /var/celery
# Copy all of the python files built in the Builder container into this smaller container.
COPY --from=Builder /usr/local/lib/python$python_version /usr/local/lib/python$python_version

# Copy binaries (e.g. opentelemetry-instrument) installed by pip in the Builder stage.
COPY --from=Builder /usr/local/bin /usr/local/bin

# Entrypoint Script
COPY ./assets/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
Expand Down