MemcachedKeyLengthError: Key length is > 250

11 April 2021

Sentry предоставляет программное обеспечение для мониторинга и отслеживания возникающих в работе ПО ошибок. Но сегодня хочу остановиться не на описании Sentry, а на настройке интеграции Sentry с LDAP (Lightweight Directory Access Protocol).

По умолчанию в состав Sentry включаются масса адаптеров для интеграции с различными системами, но LDAP необходимо ставить и настраивать отдельно. Например используя репозиторий Banno/getsentry-ldap-auth . Для установки интеграции меняем наш Dockerfile:

ARG BASE_IMAGE
FROM ${BASE_IMAGE}

RUN apt-get update && apt-get install -y gcc libsasl2-dev python-dev libldap2-dev libssl-dev \
    && rm -r /var/lib/apt/lists/* \
    && python3 -m pip install python-ldap sentry-ldap-auth

COPY . /usr/src/sentry

# Hook for installing additional plugins
RUN if [ -s /usr/src/sentry/requirements.txt ]; then pip install -r /usr/src/sentry/requirements.txt; fi

И после сборки образа и попытки использования сталкиваемся с ошибкой вида:

memcache.Client.MemcachedKeyLengthError: Key length is > 250

Которая возникает по причине попытки использования имени группы в виде ключа для memcached, что используется в Sentry.

Решается проблема изменением блока кода Cache в файле sentry.conf.py:

import hashlib

def hash_key(key, key_prefix, version):
    new_key = ':'.join([key_prefix, str(version), key])
    if len(new_key) > 250:
        m = hashlib.sha256()
        m.update(new_key.encode('utf-8'))
        new_key = m.hexdigest()
    return new_key

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
        "LOCATION": ["memcached:11211"],
        "TIMEOUT": 3600,
        "KEY_FUNCTION": hash_key,
    }
}

Повторный запуск и авторизация проходят на этот раз успешно. Спасибо Dustin Davis за статью, которая помогла решить проблему.