{"id":365747,"date":"2026-09-09T17:42:48","date_gmt":"2026-09-09T17:42:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dockray\/"},"modified":"2026-09-10T10:25:36","modified_gmt":"2026-09-10T10:25:36","slug":"dockray","status":"publish","type":"plugin","link":"https:\/\/lij.wordpress.org\/plugins\/dockray\/","author":20203493,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1","requires":"6.0","requires_php":"8.2","requires_plugins":null,"header_name":"DockRay","header_author":"Dock","header_description":"Reports PHP errors, uncaught exceptions and HTTP transactions to DockRay.","assets_banners_color":"faf9fd","last_updated":"2026-09-10 10:25:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/dockray.io","header_author_uri":"https:\/\/dock.codes","rating":0,"author_block_rating":0,"active_installs":0,"downloads":58,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jacycha","date":"2026-09-09 17:42:15","revision":3688780},"1.0.1":{"tag":"1.0.1","author":"jacycha","date":"2026-09-10 10:25:36","revision":3689726}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3689726,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3688780,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772-250.jpg":{"filename":"banner-772-250.jpg","revision":3688780,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3688780,"resolution":"1","location":"assets","locale":"","width":1600,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3688780,"resolution":"2","location":"assets","locale":"","width":1600,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3688780,"resolution":"3","location":"assets","locale":"","width":1600,"height":900}},"screenshots":[]},"plugin_section":[],"plugin_tags":[2679,29196,1522,5603,247],"plugin_category":[54,59],"plugin_contributors":[236444],"plugin_business_model":[],"class_list":["post-365747","plugin","type-plugin","status-publish","hentry","plugin_tags-debugging","plugin_tags-error-tracking","plugin_tags-logging","plugin_tags-monitoring","plugin_tags-performance","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-jacycha","plugin_committers-jacycha"],"banners":{"banner":"https:\/\/ps.w.org\/dockray\/assets\/banner-772-250.jpg?rev=3688780","banner_2x":"https:\/\/ps.w.org\/dockray\/assets\/banner-1544x500.jpg?rev=3688780","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/dockray\/assets\/icon-256x256.jpg?rev=3689726","icon_2x":"https:\/\/ps.w.org\/dockray\/assets\/icon-256x256.jpg?rev=3689726","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/dockray\/assets\/screenshot-1.png?rev=3688780","caption":""},{"src":"https:\/\/ps.w.org\/dockray\/assets\/screenshot-2.png?rev=3688780","caption":""},{"src":"https:\/\/ps.w.org\/dockray\/assets\/screenshot-3.png?rev=3688780","caption":""}],"raw_content":"<!--section=description-->\n<p>DockRay requires an account and a project at https:\/\/dockray.io (a free plan\nand paid service plans are available). The plugin itself is free.<\/p>\n\n<p>DockRay sends PHP errors and uncaught exceptions from your WordPress site to a\nDockRay project, together with the stack trace, the environment and \u2014 when you\nallow it \u2014 the logged-in user. It can also measure how long requests take.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Automatic reporting of PHP errors and uncaught exceptions<\/li>\n<li>Optional request timing, including admin-ajax actions and WP-CLI commands<\/li>\n<li>Optional user context<\/li>\n<li>Error filtering by PHP error type<\/li>\n<li>A settings screen at <strong>Settings \u2192 DockRay<\/strong>, with a live connection\nstatus and a one-click test event \u2014 no wp-config.php editing required<\/li>\n<li>Configuration can also come from <code>wp-config.php<\/code> constants, per field or\nentirely, for teams that prefer to keep the private key out of the database<\/li>\n<li>English interface with Polish, German and Spanish translations included,\nand ready for more through translate.wordpress.org<\/li>\n<\/ul>\n\n<p>Fill in the token and the private key on <strong>Settings \u2192 DockRay<\/strong> and you are\ndone. If you would rather keep the private key out of the database \u2014 a\ndatabase dump travels between environments more often than a config file\ndoes \u2014 define it as a <code>wp-config.php<\/code> constant instead; the settings screen\nshows exactly which fields are currently coming from a constant, and a\n<strong>Configuration source<\/strong> switch lets you pin the plugin to constants only,\nto the database only, or let a defined constant win per field (the default,\nand how the plugin behaved before this screen existed).<\/p>\n\n<h3>Configuration<\/h3>\n\n<p>Every setting below has a field on <strong>Settings \u2192 DockRay<\/strong> unless stated\notherwise. Each one can also be set as a <code>wp-config.php<\/code> constant \u2014 add it\nabove the <code>\/* That's all *\/<\/code> line \u2014 and the <strong>Configuration source<\/strong> switch\non the screen decides whether a constant is allowed to win, is required, or\nis ignored in favour of the database.<\/p>\n\n<p><strong>Error types<\/strong> \u2014 which PHP errors become events. Defaults to everything except\ndeprecations and notices. This one is constant-only; there is no equivalent\nfield on the settings screen, since it is a bitmask rather than a value worth\ntyping into a text box.<\/p>\n\n<pre><code>define( 'DOCK_RAY_ERROR_TYPES', E_ALL &amp; ~E_DEPRECATED &amp; ~E_NOTICE );\n<\/code><\/pre>\n\n<p><strong>Personal data<\/strong> \u2014 attaches the user id, e-mail, IP address and user agent.\nOff by default.<\/p>\n\n<pre><code>define( 'DOCK_RAY_SEND_DEFAULT_PII', true );\n<\/code><\/pre>\n\n<p><strong>Release<\/strong> \u2014 the version of the site. Without it the active theme version is\nused.<\/p>\n\n<pre><code>define( 'DOCK_RAY_VERSION', 'v1.4.0' );\n<\/code><\/pre>\n\n<p><strong>Environment<\/strong> \u2014 defaults to <code>WP_ENVIRONMENT_TYPE<\/code>.<\/p>\n\n<pre><code>define( 'DOCK_RAY_ENV', 'production' );\n<\/code><\/pre>\n\n<p><strong>Request timing<\/strong> \u2014 the share of requests that are measured, from 0 to 1.\nZero, the default, disables it.<\/p>\n\n<pre><code>define( 'DOCK_RAY_TRACES_SAMPLE_RATE', 0.2 );&lt;h3&gt;Filters&lt;\/h3&gt;\ndock_ray_token, `dock_ray_private_key` \u2014 override the\n<\/code><\/pre>\n\n<p>credentials, for instance to read them from a secrets manager.<\/p>\n\n<pre><code>dock_ray_user_context \u2014 change the user data attached to events.\n\nadd_filter( 'dock_ray_user_context', fn( array $user ) =&gt; array_merge( $user, [ 'plan' =&gt; 'pro' ] ) );\n\ndock_ray_scope \u2014 set tags and extra context before events are sent.\n\nadd_filter( 'dock_ray_scope', function ( $scope ) { $scope-&gt;setTag( 'tier', 'gold' ); return $scope; } );\n\ndock_ray_options \u2014 adjust SDK options after the client is built.\n\ndock_ray_client_builder \u2014 an action that receives the client builder before\n<\/code><\/pre>\n\n<p>the client is created.<\/p>\n\n<h3>Reporting your own exceptions<\/h3>\n\n<pre><code>if ( function_exists( 'dock_ray_safe' ) ) {\n    dock_ray_safe( fn( $hub ) =&gt; $hub-&gt;captureException( $exception ) );\n}\n<\/code><\/pre>\n\n<p>The callback runs only when the plugin is configured, so the calling code does\nnot have to check.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin sends data to DockRay (https:\/\/dockray.io), the monitoring service\nit is a client for. Nothing is sent until you enter a project token and a\nprivate key on <strong>Settings \u2192 DockRay<\/strong> or configure those credentials through\n    wp-config.php constants or plugin filters. Without credentials the plugin\nloads and stays silent.<\/p>\n\n<p>What is sent, and when:<\/p>\n\n<ul>\n<li><strong>PHP errors and uncaught exceptions<\/strong>, as they happen \u2014 the message, the\nerror type, the stack trace with the surrounding source lines, the file and\nline, the site URL, the environment and release, the WordPress version and\nthe site language.<\/li>\n<li><strong>Request timings<\/strong>, when the transaction sample rate is above zero \u2014 the\nrequest path, the HTTP method and the response status. Off by default.<\/li>\n<li><strong>JavaScript errors<\/strong>, when that switch is on \u2014 the message, the script URL\nand the stack trace, forwarded by this site rather than sent from the\nbrowser. Off by default.<\/li>\n<li><strong>The logged-in user and the visitor IP address<\/strong>, only when <em>Send user identity, IP\naddress and user agent<\/em> is on. Off by default.<\/li>\n<li><strong>A test event<\/strong>, when you click <em>Send a test event<\/em> on the settings screen.<\/li>\n<\/ul>\n\n<p>Request bodies, cookies, request headers, URL query strings and fragments,\nand stack frame argument values are removed before delivery. Error messages,\nsource code context, file paths and custom context may still contain personal\nor sensitive information supplied by your application. Review what your\napplication logs and inform your visitors before enabling monitoring.<\/p>\n\n<p>Browser reports also include the page and referrer URLs without query strings\nor fragments. Normal reports are queued until shutdown; the manual test waits\nfor an acknowledgement. The service receives the IP of the sending server.<\/p>\n\n<p>Service terms: https:\/\/dockray.io\/pl\/regulamin\nPrivacy policy: https:\/\/dockray.io\/privacy-policy<\/p>\n\n<!--section=installation-->\n<p>Requires PHP 8.2 or newer with the mbstring extension enabled.<\/p>\n\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/dockray<\/code>, or install it from the\nplugins screen.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> menu \u2014 its row gets a <strong>Settings<\/strong>\nlink straight to the next step, so there is nothing to hunt for.<\/li>\n<li>Open <strong>Settings \u2192 DockRay<\/strong>, paste in your project token and private key,\nand save.<\/li>\n<li>Click <strong>Send a test event<\/strong> to confirm it reached the panel.<\/li>\n<\/ol>\n\n<p>Both values come from the project screen in the DockRay panel. The project\ntoken identifies the project, while the private key is a secret and should\nnever be exposed publicly.<\/p>\n\n<p>Prefer <code>wp-config.php<\/code> instead? Add the constants below and the settings\nscreen will show the fields as coming from wp-config.php automatically \u2014\nnothing else to configure.<\/p>\n\n<pre><code>define( 'DOCK_RAY_TOKEN', 'YOUR_PROJECT_TOKEN' );\ndefine( 'DOCK_RAY_PRIVATE_KEY', 'YOUR_PRIVATE_KEY' );\n<\/code><\/pre>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20have%20a%20settings%20screen%3F\"><h3>Does the plugin have a settings screen?<\/h3><\/dt>\n<dd><p>Yes \u2014 <strong>Settings \u2192 DockRay<\/strong>. It shows a live configuration status, the\nresult of the last test event, and lets you edit the available settings without\ntouching <code>wp-config.php<\/code>. Anything already defined as a constant keeps\nworking; the screen shows exactly which fields that applies to.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>Request timing is off by default. When it is on, the transaction is sent after\nthe response has been handed to the browser, so the visitor does not wait for\nit.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20site%20cannot%20reach%20dockray%3F\"><h3>What happens if the site cannot reach DockRay?<\/h3><\/dt>\n<dd><p>Nothing visible. The request continues; with <code>WP_DEBUG<\/code> on, a failure to start\nis written to the PHP error log.<\/p><\/dd>\n<dt id=\"which%20languages%20does%20it%20speak%3F\"><h3>Which languages does it speak?<\/h3><\/dt>\n<dd><p>English by default, with Polish, German and Spanish translations shipped\ninside the plugin. Further languages can be contributed through\nhttps:\/\/translate.wordpress.org\/projects\/wp-plugins\/dockray\/.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Improved namespace.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Reports PHP errors, uncaught exceptions and request timings from WordPress to the DockRay monitoring panel.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/365747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=365747"}],"author":[{"embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jacycha"}],"wp:attachment":[{"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=365747"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=365747"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=365747"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=365747"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=365747"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lij.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=365747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}