Posts

Tideways 2026.2 Release

Understanding complex request traces is one of the hardest parts of performance analysis.

In this Release, we focused on making this significantly easier in Tideways. The Timeline has been redesigned to provide a clearer view of how requests are executed, with new layout modes, improved navigation, and a more consistent span model.

These changes help you follow execution order, understand dependencies, and identify performance bottlenecks faster, even in complex applications.

In addition, we improved instrumentation across frameworks and libraries, making traces more consistent and providing more detailed insights into previously less visible operations.

And finally, a teaser for our next release: AI-assisted performance analysis and optimization through the Tideways CLI, integrated with Claude, Codex, Cursor, Pi Coding Agent, and other coding agents.

Summary

Improvements to the Timeline Rendering

Waterfall & Condensed Timeline

Our Timeline has been a key part of gaining performance insights with Tideways. It is collected automatically and provides detailed request data, including SQL queries, HTTP requests, and more. We have now improved the visualization to make it more obvious to understand complex request patterns.

We introduced two new layout modes: Condensed and Waterfall. Condensed is now the default, based on our tests and feedback from beta users. You can still switch to the previous layout, now called Classic, and the preference is saved in the browser.

In Classic mode, spans are grouped by their summary. For example, all spans with sql(SELECT service) appear in the same row, regardless of when they occur. This creates a very compact view but makes it harder to follow the sequence of events over time.

The Condensed mode reuses lines only within a defined threshold and ensures that parent spans are always displayed above their children (e.g.,findCriticalOperations). This improves the visibility of dependencies and the chronological order.

The Waterfall mode is at the other extreme end, where none of the lines are reused. For this, chronological order is as obvious as possible while also often being used in other tools like dev tools in web browsers.

Each mode offers a different balance between compactness and clarity. You can switch between them depending on whether you want a high-level overview or a more detailed, step-by-step view of how a request unfolds.

Documentation: Timeline Layout Modes.

Span Pagination & Mini-Timeline

With the new display modes, it can be less obvious how often and where a span appears across a longer request.

To address this, we added additional navigation and context to the span details view when a span occurs multiple times:

  • Summary box: Shows the total count and duration
  • Pagination: Jump between occurrences of the same span in the timeline by clicking left/right
  • Mini-Timeline: Visualizes the position and duration of each occurrence, with clickable navigation

We also added this functionality to the Summary and Flamegraph tabs. Previously, only a single span was shown for the selected Flamegraph frame or table entry. Now, you can view and paginate through all corresponding spans.

More details:

Quality of life improvement: highlight and select lines

Another small improvement to the Timeline that was well received in our tests: the full row of the currently selected span is now always highlighted. In addition, clicking on a row’s summary text selects the first corresponding span automatically.

Events, Listeners, Views now with full span details

The Timeline Profiler now does not differentiate between spans and “span-events” anymore; all instrumented function calls are tracked as spans with time, memory, custom annotation context, and stack trace information.

This simplifies the UI of the Timeline Profiler and makes it easier to understand, while at the same time providing more insights individually on operations that were previously stored as just “span-events”.

Before:

After:

This migration started with PHP Extension version 5.36.0 in March 2026 and will continue over the next weeks.

More details:

Response Time Distribution Chart Improvements

Looking at the response time distribution for a transaction has also become clearer.

Apart from visual improvements, we also added the possibility for users to choose the data resolution. You can now get a compact “5% to 99%” percentile of the full resolution of our underlying histogram data structure.

Documentation: Response Time Distribution.

GraphQL Instrumentation Improvements

In GraphQL APIs, all business logic runs within a single query. Previously, field retrieval was shown as sub-operations of the GraphQL span, which made it harder to reflect the nested structure of the query.

With this Release, Tideways creates spans for objects and field resolution, making the object graph visible and helping you identify expensive parts of a query more easily.

More details:

Instrumentation improvements

  • Spans for all Symfony lifecycle methods (boot / terminate)
  • Symfony EventDispatcher is now instrumented before Symfony’s boot, supporting instrumentation outside Symfony projects.
  • Spans for Laravel’s lifecycle.
  • Migrated Doctrine spans now include annotations about the size of the workload.
  • Event names for Yii 1/Yii 2 are now properly namespaced by the component name.
  • Events for Symfony, Laravel, Magento 2, Yii 1, Yii 2, and WordPress were migrated to full-featured spans, and annotations were added where useful.
  • PHPUnit test cases now create full-featured spans.
  • Ad-hoc tables created by an SQL subselect will now be included in the list of tables shown in the timeline title, allowing to more easily distinguish different queries using dynamic tables.

Outlook: AI Insights Beta

AI-assisted development is one of the most discussed topics in software engineering right now. We are particularly interested in how Tideways performance data can help AI tools identify and resolve performance bottlenecks more effectively.

Over the last two months, we have been laying the foundation for this by making Tideways data accessible through our CLI. As part of our Beta program, we have now released a first version with support for AI-powered performance analysis and optimization.

If you would like to try it out, you can enable the AI Insights Beta in your Tideways organization settings under Beta Features. This unlocks an early preview in the CLI through tideways run.

Tideways 2026.1 Release

We’re rolling out a new wave of improvements across Tideways in our first Release of 2026, focusing on deeper visibility, smarter automation, and broader ecosystem support.

From automatic tracepoints for selected transactions and improved exception workflows to enhanced FrankenPHP worker-mode instrumentation, these features continue to reduce manual effort while increasing observability.

We’ve also expanded tracing capabilities: distributed tracing now activates automatically alongside tracepoints, and session performance is measured in a dedicated layer to help uncover locking bottlenecks. Shopware users benefit from new invalidate-cache tagging for better HTTP cache debugging, while Redis users gain key-level visibility with improved phpredis instrumentation.

Framework support continues to grow with automatic instrumentation for Tempest and Yii3, alongside improved deployment support for (Open)LiteSpeed environments. On the performance side, Tideways can now flag costly Symfony polyfill usage and recommend native extensions where beneficial.

Finally, observation data is now accessible via the REST API, making it easier to integrate detected bottlenecks into your own workflows.

As always, these updates aim to help you spot performance issues faster and spend less time on manual setup.

Automatic Tracepoints for Selected Transactions

You can now create automatic tracepoint triggers for specific selected transactions, provided that you have a Business or Enterprise plan with advanced tracepoint triggers.

Select the “Tracepoint Trigger” option from the settings dropdown on either the transaction details page or the transaction settings list.

Then configure the schedule to be daily, weekly, or monthly and the duration of the tracepoint to get started.

Acknowledge Errors and Exceptions

It’s now possible to acknowledge errors/exceptions from the error details screen, and if you don’t acknowledge an error, it will send another notification every 24 hours until it is either acknowledged, ignored, or resolved.

This helps with the situation where a notification for a new exception is overlooked accidentally and never seen again.

For all projects created before February 2026, the notification on unacknowledged errors is disabled by default. You can enable it in the settings for the “New Exception” notification.

Worker-Mode for FrankenPHP

Running FrankenPHP in worker mode now automatically recognizes every request run in the main loop, calling frankenphp_handle_request. There are no code changes required in your application to get the same support as with PHP-FPM or Apache mod_php.

This is based on the automated worker mode instrumentation, previously introduced for job queues.

Previously, implementing the necessary code changes was particularly difficult when the framework itself provided the worker script, in the case of Symfony and its Runtime component.

Tracepoints and Distributed Tracing

If distributed tracing is enabled in the PHP extension, it is now automatically activated for requests with an active tracepoint

Previously, distributed tracing was only activated for developer-triggered requests via the Chrome Extension or CLI.

Documentation: Distributed Tracing

Session Layer

Tideways now measures the time spent on session-related operations in a dedicated session layer. This primarily supports detecting blocking session performance issues due to locking, as previously described in our blog.

This includes both loading the session and updating session data when the request completes.

Supported frameworks include PHP’s session extension (including Symfony), Laravel, and WoltLab Suite.

Invalidate-Cache-Tag for Shopware

To improve our HTTP Cache debugging support from the 2025.3 release, we now add an “invalidate-cache” tag to all traces that trigger invalidation of any item in the Shopware HTTP cache. This works for both use cases of direct or deferred invalidation.

This feature should help you detect requests that are invalidating the cache unexpectedly and which may contribute to a bad page cache hit rate.

The detailed trace view then shows which cache item keys were invalidated with the timeline “markers”.

phpredis Key Instrumentation

In addition to Predis and Credis support, instrumentation for the ext/redis (phpredis) extension now includes support for collecting the key accessed by a command.

Documentation: Advanced Instrumentation

Tempest support

With Extension 5.34.0, Tideways adds automatic instrumentation for the Tempest framework, one of the newer additions to the PHP ecosystem.

This includes automatically detecting controllers as transaction names, instrumenting the framework’s exception handlers to capture errors, and creating template engine and event spans to provide additional context.

Yii3 support

We also support the new Yii3 version released at the turn of the year. This includes transaction name detection and exception handling.

(Open)LiteSpeed support

The tideways-php Debian Package now also supports installing Tideways for LSWS, installing the Tideways Extension and the INI configuration template into the correct directories.

Polyfill Bottleneck

Tideways now detects if you use a Symfony Polyfill API (Mbstring, Intl, ..) and it takes up enough time of a request that installing the actual PHP extension would give you a significant performance improvement.

Make observations available via REST API

You can now query the REST API for observation data that show detected monitoring, configuration, and code bottlenecks with detailed problem and solution information.

Due to the highly flexible nature of each problem, the list only contains metadata for now and a link to the application where the detailed information is available.

Documentation: Observations API

Tideways 2025.4 Release

In our fourth Release of 2025, we included PHP 8.5 support on the day of its release and Heartbeats to monitor your application’s pulse more closely than ever. If something is offbeat, you’ll receive timely alerts.

We improved alerting by introducing fine-granular transaction level response time and made automatic tracepoint triggers more powerful.

Summary

PHP 8.5 Support

PHP 8.5 has been released last week and Tideways – as always – supports it from the start with the PHP Extension Release 5.30.0.

Heartbeat Monitoring per Transaction

Some transactions (think cron jobs, payment completion, webhooks) are so critical for web applications that it is a sign of failure or at least a problem when no data was processed for a few minutes or hours.

Tideways can now send notifications on missing transaction check-ins at a granularity of 1 minute and more. For any given transaction, you can configure an individual check-in interval in the transaction settings.

Heartbeat Monitoring

Furthermore, we have renamed the “Missing Data” notifications on the service level to “Heartbeat Monitoring” because this name is clearer and well established.

Check our documentation for more detail.

Improved Alerting on Transaction Response Times

Alerting for response time thresholds on a per-transaction basis was previously exclusive to only bigger plans. We have completely rebuilt how it works to allow a much wider audience to benefit from this feature.

You can now configure the notification under transaction settings, just like all the other transaction-level notifications.

Improved Alerting

You will notice an added line in the performance chart for the transactions on which you enabled this feature.

Response Times

When the response is slower than expected for 5% of all requests, then an incident is created and notifications may be sent:

Improvement Transaction List Filters

Because of these new transaction notification options for heartbeats and response times, we worked on a few small improvements for the Transaction settings list:

  • You can now see at a glance which notifications are set per transaction.
  • There are filters available to only select transactions with selected notifications configured.

More nodes in Callgraphs

Callgraphs can become quite complex quickly. After all, every function call is tracked. With modern frameworks or ecommerce solutions, this can be hundreds or thousands of different functions being recorded.

Visualizing this data can be a challenge. Which is why we limit the number of visible nodes by a simple algorithm: take the three most costly function calls and build the graph upwards from there. The full list of function calls has always been available using the table on the left anyway.

But since it is helpful in some cases to see a wider range of nodes, we added an option to change this start-count using a dropdown. This might be useful, e.g., with long-running scripts, where there might be more than a handful of important calls.

Automatic Tracepoints Trigger

After introducing automatic tracepoints in the last release, there is now another strategy to create a tracepoint automatically: It picks one of the seven most high-impact transactions that are rotated every week.

This will provide you with callgraph insights into different parts of the application automatically, and in combination with the trace history this data is available over a long period of time as well.

This strategy is available for Business and Enterprise plans and is used automatically for triggers created for new services. Alternatively you can select the strategy from the settings called “Rotate between highest impact transactions”.

More Stacktraces on Spans

We’ve changed the default INI settings that control when stack traces are added to spans in a trace to 1 ms (from previously 3 ms) and increased the stack depth to 10 (previously 5). Overall, this should make stack traces more valuable for pinpointing performance problems.

PDO Transactions

Long-running database transactions can have a significant impact on database performance and should thus be active as long as necessary but as short as possible. Tideways already included individual spans for BEGIN and COMMIT / ROLLBACK queries, indicating the start and end of a transaction and the COMMIT performance.

Now Tideways will also create a “meta span” spanning the entire transaction, making it easier to see at a glance which queries are part of the transaction and for how long the transaction was active. Since rollbacks can be particularly expensive and generally indicate issues, the spans for rolled-back transactions will also be marked as “errored”.

PDO Transactions

Incoming Network for Predis

When using the predis/predis library, spans will now contain a Network (incoming) annotation, just like HTTP calls or MySQL queries.

Magento Sections

To improve the efficiency of the page cache, Magento retrieves dynamic user-specific components of the resulting page in bulk from a special “Section Loader” endpoint. Traces for this endpoint now contain spans for each component loaded, helping you find out which components are particularly expensive to calculate.

Minor PHP Extension Improvements

This release, as always, contains some minor improvements to various features. Amongst those is extending support for the automated worker instrumentation to Yii 2 Queues, support for transaction name detection with Slim 4 and extended detection of email addresses in error messages and URLs in Tideways Daemon to prevent them from leaving your infrastructure.

Check our detailed changelog for more detail.

Time to get started with Profiling! With our free trial.

Tideways 2025.3 Release

In our third Release of 2025, you’ll uncover new ways to correlate data, debug critical bottlenecks, and streamline your workflow.

Over the last few months, we have been working on powerful new features and refinements for you; designed to give you more in-depth visibility, more automation, and smoother workflows.

We’ve added Performance Correlation in our service overview, so you can now spot dependencies and degradations system-wide at a glance.

To make troubleshooting smoother, Tracepoints can now be triggered automatically, along with further improvements that give you faster, more precise profiling results.

For Shopware users, we’re introducing powerful new debugging options for the HTTP Cache, while an improved Transaction Tagging API gives you cleaner, more flexible insights across all environments.

We expanded crawler monitoring for assessment of their impact on app performance.

We’ve also sharpened instrumentation:

Magento 2 template insights for spotting hidden inefficiencies.

HTTP Location header instrumentation for more complete visibility.

Enhanced TYPO3 and AMQP insights, closing gaps in instrumentation.

On top of that, quality-of-life features like choosing the default organization shown right after login make everyday use simpler and more intuitive.

More correlation. Smarter insights. Smoother workflows. With this Release, you’ll be ready to track performance from every angle and resolve issues faster than ever.

Enjoy and see how Release 2025.3 helps you push your application performance to the next level.

Summary

Correlation In Service Overview

Through the “Service Overview” feature, Tideways allows you to pinpoint performance issues in different parts of your application. But as these services are often still connected, comparing their performance directly can reveal hidden dependencies and system-wide slowdowns.

With the new ‘All’ option in the performance screen, you can now view and compare performance graphs across all services in your project at once.

Screenshot1 Release 2025.3

Hovering over a timeslot will make the familiar detailed tooltip for that service appear, while the same timeslot is highlighted across all other charts, making cross-service correlations effortless.

Trigger Tracepoints Automatically

Tideways now allows to configure the automatic creation of tracepoints on a schedule for the transactions of a service that have the highest performance impact.

In the Project Settings, you find a new section “Tracepoints” that allows you to configure these automatic tracepoints.

Screenshot_Tracepoints

This feature is currently limited to the current request-based plans only and for all these projects, an automatic tracepoint was created already that creates a tracepoint, including callgraph collection, for the highest impact transaction once a day.

Based on this regularly available call graph trace, Tideways can detect more bottlenecks automatically and provide you with fresh insights every day in the “Observations” tab.

Additionally, Tideways can store these traces via Callgraphs in the trace history with long-term retention, enabling you to compare call graph data months or even years apart—and clearly see where your code has regressed over time.

Other Tracepoint Improvements

Callgraph Tracepoints Activated By Default

When creating a new Tracepoint, the “Activate Callgraph Profiler” checkbox is now toggled on by default, because we saw the majority of tracepoints were created with Callgraphs activated.

Screenshot Configure Tracepoints

Start Again Button for Tracepoints

A completed tracepoint can now be restarted with the same settings and duration again, by clicking on the „Start again“ button.

Screenshot_Start_Again_Button1

Debugging Capabilities for Shopware Cache

For Shopware, Tideways will now also collect the context information influencing the page cache key, making it easier to determine why a specific transaction could not be served from the page cache.

Screenshot_Debugging_Capabilities

Improved Transaction Tagging API

The \Tideways\Profiler API now includes new methods getTags(), addTag(), and removeTag(). These allow you to build up the list of tags incrementally at different stages of a transaction. For example, adding an “authenticated” tag during bootstrapping and a controller-specific tag later when the controller runs.

The page cache instrumentation, which automatically sets cached and uncached tags, received an in-depth rework. Instead of a Shopware-specific solution, it now includes direct support for Symfony’s HTTP cache, benefiting all Symfony applications and implicitly fixing some bugs within Shopware’s page cache support—for example around stale responses.

The cached and uncached tags added by the automated instrumentation and the Profiler::markPageCache*() methods will also no longer overwrite any other tags already set for the transaction.

Monitoring Crawler Impact

Crawlers, bots, and robots have always been an influential source of traffic on public-facing web applications, and with AI bots doing more and more work on behalf of users, this share is increasing recently.

To allow debugging performance issues caused by crawlers, Crawler Detection for traces was added in the 2024.3 Release of Tideways.

In this Release we are expanding its use into Monitoring: You can now see the percentage of crawlers in the current monitoring timeframe as a percentage and in the tooltip for each time slot. You can also see the crawler ratio in the history data at the daily, weekly, and monthly granularity.

Screenshot_Monitoring_Crawler_Impact

Improved Magento 2 Template Insights

Information captured for Magento blocks has been extended. Block events now contain both the name and class name of a block instead of just a block, and new events for rendered template blocks have been added.

HTTP Location Header Improvements

Tideways will now store the redirect target (location response header) as an annotation on the root span.

This helps debugging and understanding in the cases where it’s important to know where exactly a request was redirected to.

Screenshot_Location_Header_Instrumentation

Improved TYPO3 Insights

Tideways now includes automated instrumentation for TYPO3, including transaction naming, automated service detection, page cache tagging support, and Fluid Template spans.

Improved AMQP Insights

The existing AMQP instrumentation for both the amqp extension and the php-amqplib/php-amqplib composer library has greatly been extended.

  • The timeline now includes spans for the connection establishment and opening a new channel.
  • The publish command now includes annotations for the channel ID and improves reliability for the existing annotations for routing key and exchange name.
  • For the amqplib composer library, time spent communicating with the AMQP service will now be tracked more accurately within the “Queue” layer.

Select Organization shown after Log-In

For users with access to multiple organizations, any one organization can now be marked as default by clicking on the star icon and will then be visible immediately after logging in.

Time to get started with Profiling! With our free trial.

Performance Benchmark Report Q2 2025 for Magento 2

How does your Magento 2 store’s PHP backend performance compare to other operators of Magento in general?

To answer this question, we have aggregated and anonymized performance data from over 70 Magento 2 stores over the last quarter and computed benchmark numbers to compare to for the most important page types: Product details, Category Page, Search, and Homepage.

Executive Summary

  • For the Magento operators in the Top 10% and 25%, the numbers show what is possible if you operate with a focus on backend performance. The top 10% of shops perform in the range of 500 ms on average and below 1 second in the 95% percentile.
  • The slowest 25% of shops have their pages perform around 2 seconds on average and above 3 seconds in the 95% percentile in Time to First Byte (TTFB). This will affect the Largest Contentful Paint (LCP) scoring, which turns from Good to “Needs Improvement” at 2.5 seconds. These shops have no chance of reaching a good result from these numbers, as TTFB is only one factor in LCP.
  • Without very high full page cache hit ratios, many visitors of Magento 2 shops will have suboptimal performance.
  • Compared to our Shopware 6 benchmark, these numbers look worse – but they are not comparable, as a larger number of Magento stores uses Varnish for cached pages compared to PHP-based full page caching in Shopware 6.
  • The fastest and slowest 10% are 5–15 times apart, showing that there is tremendous potential in analyzing and optimizing PHP backend performance with tools like Tideways.

Benchmark of average response times

Page10% Best25% BestMedian25% Worst10% Worst
Product Details671 ms895 ms1407 ms1983 ms3071 ms
Category Page639 ms927 ms1471 ms2303 ms3199 ms
Search431 ms735 ms1087 ms2175 ms3711 ms
Homepage191 ms543 ms863 ms1535 ms2943 ms

Benchmark of 95% percentile response times

Page10% Best25% BestMedian25% Worst10% Worst
Product Details895 ms1279 ms2047 ms3071 ms5631 ms
Category Page959 ms1407 ms2303 ms3583 ms6399 ms
Search543 ms1023 ms1599 ms3071 ms6399 ms
Homepage239 ms735 ms1151 ms2175 ms4351 ms

Methodology

The data foundation for this is daily average and 95% response times of PHP requests in Magento 2 shops that have an active Tideways subscription or trial during the first quarter of 2025 and reported data to our backend. This is measured through the Tideways PHP extension, tapping into the PHP runtime.

From a Core Web Vitals perspective, this is an approximate benchmark for the Time to First Byte (TTFB) of all requests in the shop that are served by the PHP backend. Requests served cached from Varnish, Fastly or other HTTP cache in front of the shop are not included.

A shop must have had at least 5,000 storefront requests that day processed by PHP in the backend and 250 requests of the page type to be included. Only shops using the default controllers for the product details, category list, search, cart, and homepage page types are considered. This leads to 26,951 data points included in the report.

Take these numbers with a grain of salt because they intentionally include Magento users across all major PHP and Magento versions, with Elasticsearch or MySQL-based search, with Magento’s HTTP Cache enabled or using external HTTP caches (Varnish) and across all industries and customer personas.

Upcoming Improvements

In the future we plan to include non-default controllers for these pages as well, as Magento 2 stores often use plugins with custom controllers for product or category pages.

See where your store ranks

To see where your Magento 2 store is ranking, sign up to a free trial with Tideways and collect backend performance data. Tideways can recommend performance optimizations and provides effortless insights into all code-level performance problems.

Tideways 2025.2 Release

In our second Release in 2025, we’re introducing additional performance insights to help you identify and resolve even more Bottlenecks faster and more effectively.

Detailed information is now integrated in our Weekly Report, namely the number and types of the observations discovered in your application. We’re eager to make it easier than ever to stay on top of optimizations.

If some of the Bottlenecks should not match your particular project, you now have the option to ignore them, giving you greater control and flexibility.

We’ve also streamlined Checks and Alerts with a more intuitive service and environment selection UI – so setup is simpler and more user-friendly.

The Profiler was extended: We’ve added automatic insights for MySQL queries, flagging cases with missing or inefficient indexes. You’ll also get better visibility into session handler behavior, helping you catch subtle performance issues earlier.

More context. Smarter detection. Fewer surprises. Browse through our latest Release and keep your stack running smooth.

Dive into the Release and take your application performance to the next level.

Summary:

Bottlenecks in Weekly Report

Integrated into the Weekly Report, each customer can now find the statistics on the various observations, namely the number and type that were detected in their application during the past week. We have chosen the light bulb as symbol.

Mute Bottlenecks

Tideways’s list of observations has been growing steadily. If some of those don’t match your particular project, you now have the option to ignore them and to decide that they will no longer be displayed in your list by default giving you greater control and flexibility.

New Automatically Detected Bottlenecks

  • Significant sleep/usleep usage You will get alerted if traces take a long time calling sleep/usleep and removing or optimizing can improve performance.
  • Shopware6 / Consider using Elasticsearch/OpenSearch This Bottleneck highlights the need to consider using Shopware with Elasticsearch, especially given the potentially slow SQL aggregation queries (for price and properties).
  • Symfony ErrorHandler::handleError If lots of deprecations, notices or warnings are being triggered, Symfony’s error handler can slow down requests significantly. Take a deep dive with our blog post on Composer Patches.
  • ORM Query Parsing takes significant time Frequent use of Doctrine’s query parsing function can negatively impact performance.
  • Doctrine ORM: Entity Metadata not cached This suggests metadata caching may not be enabled—something strongly recommended for production uses of Doctrine ORM.
  • Refactor use of array_unique The Bottleneck array_unique suggests inefficient use of arrays; using unique identifiers as keys to maintain uniqueness automatically during insertion would be a suitable remedy. Looking for more details? Read our related blog post.
  • wp_nav_menu usage takes up a significant amount of time Heavy use of wp_nav_menu may affect performance—consider using the Automatic plugin to cache navigation menus.
  • Slow Google Analytics/Tag Manager Plugin Shopware, Magento and WordPress sites often use plugins integrating with Google Tag Manager. Caching these API calls or using custom implementations can increase performance significantly.

Overhaul of Service/Environment Filter for Checks & Alerts

You can now select which services and environments should trigger notifications via a drop-down menu. That means you don’t have to enter the complex services and environments filter language anymore to make this selection.

MySQL Statistics in Query Spans

When using MySQL, SQL spans in the timeline will now include additional annotations. The new mysql.index_usage annotation indicates when MySQL reported that no (none) or a bad index (bad) was used by the query.

The “Network” annotations known from HTTP spans are now also available on MySQL spans, giving better visibility into the size of query payloads and the amount of data fetched.

Insights on Session Handlers

During session initialization, it’s important to measure how long the process takes ****to ensure optimal performance. Blocking sessions is a regular bottleneck in PHP applications that Tideways points out.

A key configuration impacting session performance and blocking is the INI setting session.save_handler.

Traces in Tideways that open a session now show the save handler that is being used.

With this you can more get more insights on the current session behavior in your application.

For “user”-implemented session handlers, Tideways provides additional clarity on exactly what storage mechanism is being used by highlighting the concrete class.

Improve WordPress service and transactions

Several enhancements have been made to improve WordPress service performance and transaction handling:

WordPress cronjobs (wp-cron) are now fully integrated with Tideways’ transaction detection, allowing Tideways to capture each individual cronjob’s performance metrics.

The admin and the user interface of a WordPress application are now separated into two services automatically. This allows a clear distinction of their respective performance. Usually the user interface must remain fast and responsive, and for the admin interface performance is less critical.

Layer Metrics API in PHP Extension

Support has been added to make the raw layer metrics accessible via a new API. This means that the timings of the various layers (e.g. SQL Database, External HTTP calls) are now available to the application itself.

The primary use-case we have in mind for this API is the Server-Timing HTTP response header and its integration into frontend performance testing tools.

This feature is made available through the new method \Tideways\Profiler::getLayerMetrics().

This enhancement empowers developers and users to better integrate these information with other performance tools.

Time to get started with Profiling! With our free trial.

Tideways 2025.1 Release

For our first Release in 2025, we have cooked up more precise performance insights for you and can now, with Automatic Bottleneck Detection, serve you bottlenecks on a silver platter including recipes on how to fix them. Work on several improvements, like Native Worker Support in the PHP Extension, has kept us busy over the winter. A series of instrumentation improvements has chased away the winter blues and is now making way for a spring full of user-friendliness. We also present you with improvements to the Layer Monitoring and a new Notification Log. As part of the spring-cleaning, we renamed the traces that are compared with each other from Base/Target to Before/After. And that’s by no means all there is to report — dive head first in our Release and enjoy!

Summary:

Automatic Bottleneck Detection

A profiling trace in Tideways has a lot of information across Timeline and Callgraph data, and finding bottlenecks usually means diving deep into this data. In the current Release, we introduce a more comprehensive automatic bottleneck detection that is based on the data from traces that we already collect. Instead of having to dig out the bottleneck from the profiling data yourself, if it’s a known problem, we can now show you both the bottleneck AND a solution recipe. Our goal is helping you accelerate bottleneck detection and troubleshooting.

Screenshot 1 Release Q1:25

With this foundation, we plan to add automated detection for even more bottlenecks specific to certain frameworks, such as Shopware, Symfony, or Magento. This customization will bring clarity more quickly, as it expedites the process of performance optimization by saving you the time-intensive search for solutions yourself.

So far, detected bottlenecks were displayed only in ‘Traces’ listed in the ‘Bottlenecks’ tab. Now, the bottlenecks will not only be way more detailed; they will also be aggregated to the service level and shown in ‘Observations’. You will get a complete overview in the observations tab and don’t need to sift through individual traces anymore.

Our new bottlenecks can also leverage Callgraph traces. So if you collect Callgraphs regularly, we will be able to gain even more insights into where your system is slowed down. Whilst we are expanding this feature, we incorporate everything we know about PHP performance into bottlenecks.

For now, we have added automatic detection for these new bottlenecks:

  • Not using Composer Autoload Optimizations
  • Using Symfony’s trigger_deprecation excessively
  • Using Shopware’s CartPersister API incorrectly for a huge performance hit
  • Blocking page views by using the Facebook Graph API to track Events 

Native Worker Support in PHP Extension

Tideways now automatically detects transaction names for individual tasks executing within worker queues of Symfony, Laravel, Shopware 6, Magento, and WoltLab Suite.

In this Shopware 6 demo application, you can see the worker tasks individually monitored.

Screenshot 2 Release Q1:25

Native support for workers improves observability for requests that dynamically perform multiple independent (background) tasks with differing performance profiles.

Previously, Tideways would only detect the execution of a single long-running request, with the collected data and timeline showing the actions of all executed tasks. By automatically detecting the individual tasks and creating separate transactions, Tideways now can clearly attribute individual actions (e.g., SQL queries or HTTP calls) to the specific task, measure the failure rate of individual tasks and point out bottlenecks on a per-task basis. This also enables setting tracepoints on these individual tasks. 

Besides the supported worker queues listed above, we also plan to add more generic support and other frameworks in the future.

Layer Improvements

Additional Layers

While Tideways can already account for much of the time in a request when looking at our performance chart, there is still more to cover. With the following new layers, we can now provide an even more fine-grained summary of where the time is spent processing a request. 

As a result, there is less ‘Unaccounted Wait’ because more time spent waiting can be accounted for; that means more time is assigned to actionable layers. 

The layers are displayed in the averages chart in the performance section and in each trace (see layer report):

  • Waiting For CPU
  • Sleep
  • DNS
  • Mail
  • Shell
Screenshot 3 Release Q1:25

New Layer: Waiting for CPU

One of the Additional Layers is ‘Waiting for CPU’. It indicates the time spent waiting for the operating system’s scheduler to free up a CPU core to continue processing the request. It provides an indication that particular requests are experiencing delays in processing that are not necessarily caused by the request itself, but insufficient hardware resources or other processes, such as a database running on the same server, performing computationally expensive processing.

Layer Report: a high-level breakdown of your traces

The first thing you see when you open a trace now is a complete, detailed layer report, a breakdown of all the layers that contributed to the total time of that trace.

Screenshot 4 Release Q1:25

Improved Layer Collection

As part of the improvement of the layer functionality, we did not just add additional layers and improved the UI, we also cleaned up the technical basis that collects the layer information within the Tideways extension. 

As a result, the collected data is more precise. For example, async HTTP requests using CurlMultiHandle now measure the time that is spent processing the retrieved data. 

Previously, the entire time from sending the request until the full response is received was measured, which would consider the sum of the runtime of parallel requests, exceeding the actual time spent blocking. 

Notification Log

We added a new ‘Notification Log’ for Errors/Exceptions, Incidents, and Releases. For each of these events, users can now view the date and time of the notifications and through which channel, e.g. Slack or email, they were notified.

Screenshot 5 Release Q1:25

session_write_close() in Timeline

Tideways will now indicate with a timeline marker when session_write_close() is used, indicating the time the session is unlocked. This can help other requests to go on without further ado.

When using PHP’s integrated session functionality, sessions are automatically locked for concurrent access while they are in use by a request to prevent race conditions. As a result, requests using the same session are blocked until previous requests finish. When no additional modifications to the session data need to be made, for example in read-only requests, the session_write_close() function can be used to write the updated session data and unlock the session, allowing other requests to proceed without waiting for the request to finish. Similarly to the existing marker for fastcgi_finish_request().

Trace Comparison: Base/Target is now Before/After

Previously, we used ‘Base’ and ‘Target’ as names for two traces that were to be compared with each other. This technical reference has now been altered in favor of a temporal perspective. Using ‘Before’ and ‘After’, the naming is now solely based on the chronological order of both traces. ‘Before’ for the older trace and ‘After’ for the newer one. Regardless of the comparison direction, the traces retain their names. It can be Before ⇒ After or After ⇒ Before.

Why do two traces differ in speed? By comparing them, you can detect why. A comparison of two traces can also make optimizations visible. Does the change I initiated make a difference, regarding speed? This question can be answered by making use of the trace comparison.

Screenshot 6 Release Q1:25

Show muted errors in the UI

The action ‘Don’t Notify’ for Errors/Exceptions was renamed to ‘Mute’ or ‘Unmute’, and in addition you can now see this in the UI with the crossed-out microphone icon.

Screenshot 7 Release Q1:25

Keep User-Agent for crawlers in trace metadata

Since Tideways Release 2024.3, Tideways recognizes requests performed by crawlers and adds a ‘Crawler’ tag. For requests tagged ‘crawler’, the full User-Agent will be available on the root span of a trace, allowing you to take action if an undesired crawler makes excessive requests to expensive routes.

Screenshot 8 Release Q1:25

Instrumentation improvements

As always, this Tideways Release includes a number of assorted improvements and bug fixes to the existing instrumentation functionality.

  • The experimental MongoDB instrumentation added in Tideways 5.7.0 replaces the old MongoDB instrumentation as of 5.15.0. The new instrumentation is more reliable and provides better insights into the commands used.
  • Each MongoDB command span now has peer.host and peer.port annotations, indicating the exact server the command was sent to. The mongo.service annotation on the “connect” span was removed, since the MongoDB client dynamically detects the cluster topology, making this information misleading.
  • MongoDB: Logical conjunctions, such as ['field' => ['$gt' => 0, '$lt' => 10]] are now correctly reported in the mongo.filter annotation.
  • HTTP requests performed using cURL multi now unconditionally collect a stack trace when calling curl_multi_add_handle(), pointing towards the location where the request is actually initiated, instead of the curl_multi_exec() event loop.
  • Collect Shopware DAL spans in the EntityRepository instead of the EntitySearcher to catch more cases.
  • A new swdal.criteria.title annotation is available on Shopware DAL spans, containing the result of Criteria::getTitle().
  • The instrumentation for colinmollenhour/credis, which amongst others, is used by Magento now supports the tideways.features.redis_keys feature.
  • Add the cached tag to pages returned from Magento’s page cache.
  • Add automated service detection for WoltLab Suite’s ACP.
  • Symfony Messenger transactions now include a span for each message handler.
  • Improve Callgraph for Doctrine, by disambiguating calls to UnitOfWork::createEntity(), allowing to measure hydration performance per entity type.
  • Instrument Symfony’s ErrorHandler component, allowing to see Exceptions handled by it in Tideways.

You can see these changes listed by PHP extension version on the changelog page.

Time to get started with Profiling! With our free trial.

Tideways 2024.3 Release

We strive to improve clarity and user-friendliness, and have thus focused our efforts on several features that align with this objective. Our new Sidebar Menu, the Release Tracking Feature and an increased comparison range for Releases and Markers as well as the possibility to show error messages in notifications all fall into this category.

Summary:

PHP 8.4 support from the start

PHP 8.4 will be released at the end of November 2024 and Tideways – as always – supports  it from the start with the PHP Extension Release 5.14.0.

The last versions of the PHP extension also added new instrumentations: DNS functions, password hashing and sending e-mails are now visible in the Timeline Profiler.

Turn navigation into an intuitive experience: Our new Sidebar Menu

We are convinced that the new Sidebar Menu improves usability and discoverability and makes the overall navigation experience more intuitive. With an increasing amount of primary features in Tideways, the top navigation no longer provided enough room to accommodate them anymore. A sidebar navigation proved to be the most effective approach to meet this challenge and enhance its user-friendliness.

There are new shortcuts in the sidebar navigation:

  • If you click on the Tideways logo or the organization, a popup will open, allowing you to swiftly navigate between all your organizations and projects.
  • From the footer navigation, you can access user and organization settings.
  • Main features such as Tracepoints, Incidents or Slow SQL queries are now available directly from the sidebar navigation.

In the line of improving our menu, it is now possible to jump directly to the relevant performance details of a trace via the widget “Go”.

We decided to switch to the new Sidebar Menu completely and activate it for everyone by default. You will be able to go back to the old sidebar navigation from the “User Settings” until the end of the year 2024; thereafter, only the new Sidebar Menu will be available.

Compare Aggregated Traces directly from Incident and Release Tracking

What was previously feasible at the monitoring level has now become feasible also at the profiling level.

Now, it is possible to identify the leading cause behind a change in performance, rather than simply observing that a change happened. 

Subsequently, it has become more convenient to compare performance data from two distinct time periods.

You can instruct Tideways to compute an aggregate of traces from before and after the comparison time and Tideways will immediately show you the differential flame graph that allows spotting the degraded calls such as SQL queries.

There are three possibilities to start into this performance comparison 

  1. Set/Add markers. To display performance before and after a selected date, you can set/add a named marker. This is useful to reference important events in the project lifecycle and allows a swift comparison between the before and after. A significant event could be, for instance, the start of an email marketing campaign.
  1. Use the Release Tracking Feature: Since markers do not support automated notifications, the Release Tracking Feature should be used to compare performance prior to and subsequent to releases. You can see a list of recent releases on the left side of the release tracking screen: 

Below the details, which show a before-and-after comparison, transactions for this timeframe are listed:

3. Response Time Incident: When a response time incident is triggered the Tideways UI now shows the most degraded and improved transactions in the timeframe before and after the start of the incident.

Increased Comparison Range for Releases and Markers

Comparing data sets from different time periods can be very revealing when you want to evaluate the performance of a website. By extending the time frame from a maximum of 90 minutes to a maximum of one day, a whole day’s worth of data can now be included in the comparison of release events or markers. Fluctuations can be factored out much better, and thus results are more meaningful. You get more insight into what has really changed.

Crawler Detection

Crawlers can be recognized in Tideways and are now displayed with the tag “crawler”. Using filters, only the traces that were triggered by crawlers can be shown.

The identification of crawlers works based on user agents. It is not enabled by default and can be enabled with php.ini configuration change: tideways.features.crawler_detection=1

Allow opt-in to show error messages in notifications

We’re pleased to announce that we’ve built this feature in response to quite a few customer requests and that it’s ready for use now. They asked us to make it easier for them to see exception messages directly in notifications, and we’re delighted to have done that for them.

Exception messages can be the key to determining the cause of an error easily. Since they could potentially contain private data, we initially decided against including them in notifications. 

However, as their importance can’t be underestimated, we now allow toggling to include error messages in email, Slack or Microsoft Teams notifications. The inclusion of error messages remains disabled by default due to privacy concerns.

Don’t get spooked by bad PHP performance. Try Tideways and get your remedy!

Tideways 2024.2 Release

Get the cake, Tideways is turning ten!

Exactly on this day ten years ago, we lifted the veil on Tideways’ predecessor and thus began our exciting journey that continues to this day.

We would like to celebrate by presenting interesting new features to you.

Summary:

You can also watch a recording of our webinar on the topic, where Benjamin connects all these new features into a small story of improving a Shopware 6 plugin.

Differential Flame Graph

Differential Flame Graphs are a visual representation of a comparison between two sets of profiling data and is a beneficial tool for quickly identifying the root causes of performance problems. To benefit best from the findings, in Tideways they are presented in a comprehensible comparison box which shows the comparison base and the target, a summary and an example span. Unlike before, it’s now possible to see at a glance why a trace has become faster or slower.

It’s useful for instance to check whether a change in the source code, a system update or a configuration change improved performance or brought about a regression. It’s also possible to compare traces from different time periods or of different system states.

The color code depicts the most common way Differential Flame Graphs are presented. Red colors, alert you to an increase in execution time or resource usage. Blue, on the other hand, depicts a decrease. There are different shades of blue and red to depict minor or major decreases and increases. Neutral colors mean that no significant change has occurred.

Our Differential Flame Graph is interactive; you can hover over or click on the different areas to get more specific information.

The high level of detail helps to find an unwanted outlier in time or memory consumption faster.

Share Trace Comparison

The comparison of two traces can now be shared with persons who don’t have a Tideways account or are not members of the respective organization. This is an immensely helpful addition to the existing feature that already allowed the sharing of a single trace.

You can click the share action directly from a trace comparison and share a link to it. That makes investigating performance problems and validating improvements much easier.

When sharing a trace in Slack or in other chat / social media tools, a preview is generated to offer the message receivers a summary:

Dynamic Instrumentation for Functions from the UI

Dynamically instrumented functions are a new feature within Tideways to improve Profiling data and in turn identify performance problems even faster.

Previously, instrumentation was either defined within the Tideways extensions and could be added by changing the code to use the attribute #[WithSpan]. Now you can add instrumentation to your functions by simply clicking the “Dynamically Instrument Function” button from the callgraph interface. 

No changes in your application code or deployment of a new version needed!

Transaction Failure Rate Alerts

What failure rate is acceptable for individual transactions? To find out what causes errors in one specific transaction, a failure threshold can be set for each individual transaction. The failure threshold is based on a list of predefined percentages and can be configured via the transaction settings page. 

To that end, you can set up a notification under “Project Settings > Notifications”. You then get notified via Slack or email or other supported integrations when the failure rate for a transaction increases and it needs attention to be resolved. 

For more details on how to configure it view our documentation.

IDE Integrations

You can now use the “Open in IDE” icon in Errors and Callgraphs. This makes it easier to directly switch from Tideways into the code and start fixing a bug or performance problem.

At the moment you can configure this integration for PhpStorm and VSCode. For third party libraries you can also directly jump to the code on GitHub without the need to configure anything.

For more details view our documentation.

PHP Extension:

Improved Stacktraces from Third Party Libraries

For libraries such as Doctrine, Guzzle and Laravel, stacktraces in the Timeline Profiler are now modified to show primarily frames from your code-base and not from the library. Before, due to the limiting of the stackframes size they sometimes included only frames from the library itself and no indication where in the application they occurred. Relevant ones were sometimes cut off. Now, the stacktrace is cut off to show primarily application-code function calls.

In addition we reduced the default duration for a span to keep its stacktrace from 5ms to 3ms and increased the number of stacktraces Tideways keeps per trace across plans.

FrankenPHP Support

FrankenPHP Tideways

Tideways is the first APM solution that fully supports FrankenPHP, including worker mode. Starting from PHP extension 5.8.0, Tideways supports FrankenPHP.

Worker mode only loads your framework once into memory. Subsequently, it sends requests to the same instance of your application and doesn’t spin up a new instance for every new web request. 

That means that one gives up the shared nothing of for example PHP-FPM or even FrankenPHP without worker mode but saves time and optimizes performance. 

For more details on how to use FrankenPHP with Tideways see our changelog entry and our documentation.

WoltLab Suite Support

Tideways now also includes instrumentation of WoltLab Suite out of the box. The Tideways PHP Extension will automatically detect which type of page of your community has been accessed to automatically fill in the transaction name, making the collected data useful without requiring manual changes on your end.

You’ll never know until you try … our free trial!

Optimizing Shopware 6 Checkout Performance with Callgraph Tracepoints

A few weeks ago, Andrey from Ecommlab contacted me to ask me about a strategy to get performance insights from Tideways into Shopware 6 checkout. 

The store of our joint customer “Bär Schuhe” was slow for customers during the order confirmation process.

Optimizing checkout performance is important but much more difficult than product or category pages for two reasons:

  • Customers do not visit them nearly as often as they view products/categories.
  • As a developer it is difficult to put them into production without causing payment transactions and order cancellations in the ERP system. 

In this blog post, we will go through an optimization of the order confirmation step in the checkout process, reducing the 95% percentile performance from 1-2 minutes to 6-9 seconds.

Identifying the Bottleneck with a Callgraph Tracepoint

Looking at Timeline profiling traces collected from customers of the “Bär Schuhe” store, nothing immediately jumped out as a bottleneck.

To get more detailed profiling data at the function level, we created a callgraph tracepoint and, after waiting for the results, examined the slowest collected callgraph to identify the bottleneck. 

One plugin stood out, taking 66% of a 45-second request and causing approximately 50,000 objects to be created from database rows. This is a custom plugin that connects the store to the ERP system. The combination of slowness and excessive database load warrants an investigation of the plugin’s code:

There are a lot of associations being eagerly loaded for the order transaction, which makes us wonder which one is responsible for the majority of the 50,000 or so database objects being created. 

Comparing this piece of plugin code with other places in the Shopware core and available plugins, we determined that the bottleneck is most likely caused by eagerly loading the state machine history.

Confirming the Optimization Works

Andrey confirmed that removing this line did not break the code and rolled it out to production, where we confirmed our hunch: Performance for the order completion step of the checkout dropped from up to 2 minutes to a maximum of 17 seconds. 

The following comparison shows that the plugin code is now 29 seconds faster overall, and that the creation of 50,000 database objects was reduced, accounting for the majority of the time savings, 16 seconds.

Conclusion

This solves the biggest performance bottleneck in the order confirmation process code with a one-line change. 

Further improvements to the checkout were made to bring the user experience to an acceptable level, but each had a much smaller impact overall than this one.

This shows how based on insights from a Profiler, you can start optimizing the biggest bottlenecks first and minimize the time spent optimizing.

For a quick read, you also find this Case Study as a pdf here:

What an AI would never be able to tell you the way we can! Follow us on LinkedIn or X and subscribe to our newsletter to take a deep dive into technical issues surrounding PHP performance.

You’ll never know until you try … our free trial!