MemcachedKeyLengthError: Key length is > 250
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 за статью, которая помогла решить проблему.