asbiin/laravel-sentry-tunnel

Provides an endpoint to use the `tunnel`-parameter of the Sentry SDK
55,412 2
Install
composer require asbiin/laravel-sentry-tunnel
Latest Version:2.4.0
PHP:^8.2
License:MIT
Last Updated:Mar 28, 2026
Links: GitHub  ·  Packagist
Maintainer: asbin

Laravel Sentry Tunnel

This package provides a URL for use with the tunnel-option of the Sentry SDK.

Latest Version Downloads Workflow Status Quality Gate Coverage Status

Installation

composer require asbiin/laravel-sentry-tunnel

Configuration

You can optionally publish the configuration files:

php artisan vendor:publish --provider=SentryTunnel\\Provider

Allowed hosts and projects

The project will use SENTRY_LARAVEL_DSN value to set the valid sentry host and project to tunnel the traffic for.

You can define the allowed hosts by setting the SENTRY_TUNNEL_ALLOWED_HOSTS value in your .env file, and the allowed projects by setting the SENTRY_TUNNEL_ALLOWED_PROJECTS value.

SENTRY_TUNNEL_ALLOWED_HOSTS=my.host.com
SENTRY_TUNNEL_ALLOWED_PROJECTS=1234,456,78

Surrounding whitespace is ignored, and hosts are matched without regard to case, so my.host.com, other.host.com works as written. If the host list is empty, every request is refused.

Security

This essentially creates a reverse proxy to the SENTRY_TUNNEL_ALLOWED_HOSTS. As the Sentry DSN is not kept secret, this enables everyone to send messages to these hosts that seem to originate from your server.

Therefore, the default middleware list for the tunnel URL includes web, auth (so that only authenticated users can use the endpoint) and throttle:300,1, which limits one caller to 300 reports per minute. The rate limit sits after auth so an unauthenticated probe is refused without consuming a slot.

You can change the middleware list of the tunnel endpoint by setting the sentry-tunnel.middleware value of your config/sentry-tunnel.php file.

Payload size

The tunnel refuses an envelope larger than sentry-tunnel.max-payload-size with a 413, before the body is read.

SENTRY_TUNNEL_MAX_PAYLOAD_SIZE=20971520

The default of 20 MiB sits far above anything a browser SDK produces, including session replay and profiling payloads, and below Sentry's own envelope ceiling, so it never refuses a report Sentry would have accepted. Set it to null in the config file to disable the check. PHP's post_max_size is not a substitute: it is not applied to a body whose content type is not a form type.

Timeouts

SENTRY_TUNNEL_TIMEOUT=5
SENTRY_TUNNEL_CONNECT_TIMEOUT=2

How long, in seconds, the tunnel waits for Sentry. These replace the framework defaults of 30 and 10 seconds, and bound how long a server worker is held when Sentry is slow or unreachable. The rate limit does not bound this — it limits how many requests are admitted, not how long each one is held. Raise them if your egress proxy is slow. When the timeout expires the caller receives a 504.

Logging

SENTRY_TUNNEL_LOG_LEVEL=warning

The level at which a failed or unreachable Sentry request is logged, with the upstream status, host and project — never the upstream response text, and never the envelope.

The default is warning on purpose: the Sentry Laravel SDK treats an ordinary log record at that level as a breadcrumb rather than an event. Raising this to error makes tunnel failures visible as events, but it also means every failed relay sends a new report to the very Sentry instance that is already failing.

Responses

The tunnel relays Sentry's own status code, along with the Retry-After and X-Sentry-Rate-Limits headers, so that the Sentry SDK can apply its own backoff when your organisation is being rate limited. On success the upstream body and content type are relayed too. On an upstream error the status is relayed but the body is not, so Sentry's error text is never disclosed to the browser.

CsrfToken

As you currently cannot pass a dynamic X-XSRF-TOKEN header in Sentry's transportOptions you either have to implement your own transport or place the tunnel URL in the exclude-list in the VerifyCsrfToken middleware.

  • Add the URL to the except array in the VerifyCsrfToken middleware.
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        '/sentry/tunnel',
    ]);
})
  • OR Implement your own transport

example:

const myTransport = (options) => {
  const makeRequest = async (request) => {
    const requestOptions = {
      data: request.body,
      url: options.url,
      method: 'POST',
      referrerPolicy: 'origin',
      headers: options.headers,
      ...options.fetchOptions,
    };
    return axios(requestOptions).then((response) => ({
      statusCode: response.status,
      headers: response.headers,
    }));
  };
  return createTransport({ bufferSize: options.bufferSize }, makeRequest);
};

Sentry.init({
    // ...
    transport: myTransport,
});

URL

You can change the URL of the tunnel if required. The default value is /sentry/tunnel

SENTRY_TUNNEL_URL="/super/secret/tunnel"

Usage

Consult Sentry's documentation.

Citations

This package has been forked from naugrim/laravel-sentry-tunnel, with some slight changes.

License

Author: Alexis Saettler

Copyright © 2024.

Licensed under the MIT License. View license.

Related Packages

php-tmdb/laravel

Laravel Package for TMDB ( The Movie Database ) API. Provides easy access to the...

53,315 160
oriceon/oauth-5-laravel

OAuth Service Provider for Laravel 5

1,671,889 174
artdarek/oauth-4-laravel

OAuth Service Provider for Laravel 4

523,362 677
oriceon/toastr-5-laravel

Easy toastr notifications for Laravel 5

503,999 79