Skip to content

Adding Bitbucket Repository connection fails with 500 #113276

@AlexanderLangguth

Description

@AlexanderLangguth

Environment

self-hosted (https://develop.sentry.dev/self-hosted/)

Steps to Reproduce

  1. Open the Settings -> Orgnanization -> Repositories section
  2. Next to "Bitbucket", click on "Install Config"
  3. Accept the OAuth in popup window.

Expected Result

The bitbucket repository connection is added to sentry.

Actual Result

The popup window shows my "Managed installed apps" page in bitbucket, and the URL has these parameters on it:
?error=server_error&error_description=The+app+failed+to+be+installed%3A+Error+calling+installed+at+URL+https%3A%2F%2Fself-hosted-sentry-domain.com%2Fextensions%2Fbitbucket%2Finstalled%2F%3A+500+Server+Error%3A+Internal+Server+Error+for+url%3A+https%3A%2F%2Fself-hosted-sentry-domain.com%2Fextensions%2Fbitbucket%2Finstalled%2F&principal=our-principal

(I replaced our domain with self-hosted-sentry-domain.com and our principal with our-principal.

When i check the logs of the docker containers i see these:

From postgres-1:

2026-04-17 10:20:22.899 UTC [43] ERROR:  value too long for type character varying(64)
2026-04-17 10:20:22.899 UTC [43] STATEMENT:  INSERT INTO "sentry_integration" ("date_updated", "date_added", "provider", "external_id", "name", "metadata", "status", "debug_data") VALUES ('2026-04-17T10:20:22.898180+00:00'::timestamptz, '2026-04-17T10:20:22.898183+00:00'::timestamptz, 'bitbucket', 'ari:cloud:bitbucket::app/{54cd1367-3824-4c5d-a56c-4eb76cddbd85}/self-hosted-sentry-domain.com.bitbucket', 'our-principal', '{"sentry_encrypted_field_value": "enc:plaintext:SOME_LONG_BASE64_STRING"}'::jsonb, 0, '{}'::jsonb) RETURNING "sentry_integration"."id"

From web-1:

Traceback (most recent call last):
  File "/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 948, in get_or_create
    return self.get(**kwargs), False
           ~~~~~~~~^^^^^^^^^^
  File "/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 635, in get
    raise self.model.DoesNotExist(
        "%s matching query does not exist." % self.model._meta.object_name
    )
sentry.integrations.models.integration.Integration.DoesNotExist: Integration matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", line 105, in _execute
    return self.cursor.execute(sql, params)
           ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/usr/src/sentry/src/sentry/db/postgres/decorators.py", line 16, in inner
    return func(self, *args, **kwargs)
  File "/usr/src/sentry/src/sentry/db/postgres/base.py", line 95, in execute
    return self.cursor.execute(sql, params)
           ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
psycopg2.errors.StringDataRightTruncation: value too long for type character varying(64)


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/sentry/src/sentry/api/base.py", line 317, in handle_exception_with_details
    response = self.handle_exception(exc)
  File "/.venv/lib/python3.13/site-packages/rest_framework/views.py", line 475, in handle_exception
    self.raise_uncaught_exception(exc)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/.venv/lib/python3.13/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
    raise exc
  File "/usr/src/sentry/src/sentry/api/base.py", line 431, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/src/sentry/src/sentry/integrations/bitbucket/installed.py", line 32, in post
    ensure_integration(IntegrationProviderSlug.BITBUCKET.value, data)
    ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/sentry/src/sentry/integrations/pipeline.py", line 56, in ensure_integration
    integration, created = Integration.objects.get_or_create(
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        provider=key, external_id=data["external_id"], defaults=defaults
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/sentry/src/sentry/silo/base.py", line 158, in override
    return original_method(*args, **kwargs)
  File "/.venv/lib/python3.13/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/usr/src/sentry/src/sentry/silo/base.py", line 158, in override
    return original_method(*args, **kwargs)
  File "/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 955, in get_or_create
    return self.create(**params), True
           ~~~~~~~~~~~^^^^^^^^^^
  File "/usr/src/sentry/src/sentry/silo/base.py", line 158, in override
    return original_method(*args, **kwargs)
  File "/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 665, in create
    obj.save(force_insert=True, using=self.db)
    ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/sentry/src/sentry/silo/base.py", line 158, in override
    return original_method(*args, **kwargs)
  File "/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 902, in save
    self.save_base(
    ~~~~~~~~~~~~~~^
        using=using,
        ^^^^^^^^^^^^
    ...<2 lines>...
        update_fields=update_fields,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/sentry/src/sentry/silo/base.py", line 158, in override
    return original_method(*args, **kwargs)
  File "/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 1008, in save_base
    updated = self._save_table(
        raw,
    ...<4 lines>...
        update_fields,
    )
  File "/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 1169, in _save_table
    results = self._do_insert(
        cls._base_manager, using, fields, returning_fields, raw
    )
  File "/.venv/lib/python3.13/site-packages/django/db/models/base.py", line 1210, in _do_insert
    return manager._insert(
           ~~~~~~~~~~~~~~~^
        [self],
        ^^^^^^^
    ...<3 lines>...
        raw=raw,
        ^^^^^^^^
    )
    ^
  File "/.venv/lib/python3.13/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1873, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/.venv/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 1882, in execute_sql
    cursor.execute(sql, params)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/.venv/lib/python3.13/site-packages/sentry_sdk/utils.py", line 1872, in runner
    return sentry_patched_function(*args, **kwargs)
  File "/.venv/lib/python3.13/site-packages/sentry_sdk/integrations/django/__init__.py", line 656, in execute
    result = real_execute(self, sql, params)
  File "/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", line 79, in execute
    return self._execute_with_wrappers(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        sql, params, many=False, executor=self._execute
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/src/sentry/src/sentry/db/postgres/base.py", line 70, in _execute__include_sql_in_error
    return execute(sql, params, many, context)
  File "/usr/src/sentry/src/sentry/db/postgres/base.py", line 58, in _execute__clean_params
    return execute(sql, clean_bad_params(params), many, context)
  File "/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", line 100, in _execute
    with self.db.wrap_database_errors:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/.venv/lib/python3.13/site-packages/django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/.venv/lib/python3.13/site-packages/django/db/backends/utils.py", line 105, in _execute
    return self.cursor.execute(sql, params)
           ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/usr/src/sentry/src/sentry/db/postgres/decorators.py", line 16, in inner
    return func(self, *args, **kwargs)
  File "/usr/src/sentry/src/sentry/db/postgres/base.py", line 95, in execute
    return self.cursor.execute(sql, params)
           ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django.db.utils.DataError: value too long for type character varying(64)

SQL: INSERT INTO "sentry_integration" ("date_updated", "date_added", "provider", "external_id", "name", "metadata", "status", "debug_data") VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING "sentry_integration"."id"
10:20:22 [INFO] sentry.access.api: api.access (method='POST' view='sentry.integrations.bitbucket.installed.BitbucketInstalledEndpoint' response='500' is_frontend_request='False' path='/extensions/bitbucket/installed/' caller_ip='104.192.142.248' user_agent='python-requests/2.32.3' rate_limited='False' request_duration_seconds='0.05239725112915039' rate_limit_type='DNE')
10:20:22 [ERROR] django.request: Internal Server Error: /extensions/bitbucket/installed/ (status_code=500 request=<WSGIRequest: POST '/extensions/bitbucket/installed/'>)

I guess the external_id field is too long?
ari:cloud:bitbucket::app/{54cd1367-3824-4c5d-a56c-4eb76cddbd85}/self-hosted-sentry-domain.com.bitbucket
The original with our own domain is 103 characters long. But even up to the / behind the uuid it is already 64 characters.

Product Area

Settings - Repositories

Link

No response

DSN

No response

Version

26.3.1

Metadata

Metadata

No fields configured for issues without a type.

Projects

Status

No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions