Posts

Trigger Trace 2.0 Preview: What’s New

Last year we asked all our customers what they think we should work on and “Triggering Traces” came out on top. We started planning a prototype in Winter last year and are ready to share the current state and a few ideas ideas as we launch the beta program. The general release date is planned for late February/March.

The Problem to Solve

To allow you investigating performance problems, Tideways collects traces from users, sampled to a limited number every minute and allows developers to trigger traces manually using the Chrome Extension or a CLI command.

But sometimes it is not that easy to trigger a trace, and there isn’t exactly the right one available from randomly sampled application requests.

We want the triggering of traces to be as simple as clicking a button or calling one command and you get a trace a few seconds to minutes later when any user of your site triggered the endpoint you are investigating.

So we want Breakpoints, but for Profiling, also commonly known as tracepoints.

Boost Traces of Selected Endpoints

The first pillar of our quest for better trace triggering is what we call “Trace Boosting”. When inside a transaction/endpoint, you will see a button to “Boost Traces”, which massively prioritizes traces of this endpoint being sent from a daemon to Tideways.

Boost a TraceBoost a Trace

You will be able to configure additional criteria when a trace should be boosted, for example only when slower than 500ms, when on specific hosts, urls or when any custom variable matches, for example userId equals 123.

These boosts run for an hour by default and will send you notification e-mails when the first matching trace is collected and a summary when the boosting period is over.

Trace Boost Report after 60 minutes via e-mailTrace Boost Report after 60 minutes via e-mail

This will give you access to timeline traces in a much more controlled way. But it still relies on traces being randomly sampled by the PHP Extension. If you set a sample rate of 20%, this means only 20% of the requests are evaluated against the trace boosting criteria, and maybe more importantly they only contain timeline profiling data, not function/callgraph level data.

For the first time we will also have a screen that is specific to your user, listing all active and past trace boosts to let you get back to your specific profiling session.

List of active and completed trace boostsList of active and completed trace boosts

This screen is actually very exciting to ship, because we realized how a user-centric view of traces could massively improve the profiling workflow in general.

Tracepoints

The second pillar is a way to dynamically increase sampling and callgraph profiler activation in selected requests. For this functionality we are working on a feature we call “Tracepoints” that can be used standalone or in combination with “Trace Boosting”.

For a tracepoint you specify an entry point (script name or request uri), a new sample rate and optionally a function name that starts the Callgraph Profiler when called, for example main() or for example a controller name AppDefaultController::indexAction.

Tracepoints are synchronized back to the PHP extension in regular intervals.

Control via REST API and CLI

With trace boosts and tracepoints you get much more control over profiling with Tideways and to make it even more powerful, you can also trigger these features either directly using a REST API or with the “tideways” cli:

$ tideways trace:boost acme/demo-app "AppDefaultController::indexAction" 

Which is the same as clicking the boost trace button in the UI for this endpoint. Or for a tracepoint:

$ tideways trace:tracepoint acme/demo-app "/foo/bar" --sample-rate=100 --callgraph=AppDefaultController::indexAction 

Which triggers a callgraph on page /foo/bar with a sample rate of 100%.

Want to see it in action?

We are just finishing the internal alpha of this feature and are looking to roll out a beta version of some functionality to testers. If you want to get into the first batch, send us a ping to [email protected]. We will then activate this feature for more and more customers and incorporate their feedback for the final release sometime in March.

Tideways No. 5

A few weeks into year five of the Tideways project we are happy to announce the release of Tideways version 5, including large updates to all parts of the stack from PHP extension, daemon and the user-interface. Ladies and gentlemen, this is Tideways no. 5!

Source: Excerpt quoted from Mambo No.5 (A little bit of.) by Lou Bega (1999)Source: Excerpt quoted from Mambo No.5 (A little bit of.) by Lou Bega (1999)

For now the new version is only available when you change the package repository URLs to new endpoints, and on September 17th we will be pushing the version 5 release on the old repository as well so that automatic upgrades of your systems will pick it up.

New: Monitoring Performance of Downstream Databases, File I/O and Services

Tideways now collects more data in monitoring mode, and always capture the total performance of SQL, HTTP, Redis, Memcache, File I/O and other downstream services for monitoring purposes.

This unlocks a much requested feature to show the performance of all these layers directly in the monitoring chart of Tideways. With 100% of requests collecting this information with very low overhead, we can give you an accurate distribution of all requests to layers and capture the latency of every outlier.

The downstream service performance will be available on an application/service level in every plan, and if you upgrade to the new Pro plan every endpoint will have downstream layer monitoring data as well.

Read more: Blog post about downstream service performance

New: Memory Profiling

We finally added much requested memory profiling support both to the timeline and the callgraph profiling modes. First, you can see the memory amount that was allocated during the full execution of a selected timespan in the timeline profiler. Secondly, you can switch to Memory View and see a timeline of the allocated memory from 0 to peak memory. Thirdly, the callgraph profiler can now show the allocated memory of each and every function call.

New: Simpler and Better Transaction Naming

With the old versions of Tideways you had to configure the tideways.framework INI setting or call a custom function to name your transactions. Starting with version 5, we automatically detect the framework for you and if you aren’t using one, then we will use the basename of SCRIPT_FILENAME instead of grouping everything into a single, undifferentiated “default” transaction as before. This helps alot with WordPress applications for example, where the admin actions are mostly controlled from different scripts.

New PHP Extension v5.0

All these features are only possible because of our new version 5 of the PHP extension – rewritten from scratch and not based on the original XHProf codebase anymore. Designed specifically around the new PHP 7 Zend Engine it achieves a reduction in overhead. Of course PHP 5.3 – 5.6 are also still supported by this new version.

We moved to an entirely new datastructure that is better suited for future improvements and makes it easier to support new frameworks and libraries and potentially new languages in the future. You will see this directly when looking at traces, where we now group framework spans and events together more closely. In some cases such as Symfony we are also able to store the duration of listeners in addition to events from now on.

From a configuration perspective the extension now works with better defaults and improved batching and truncating in case of large traces and an abort condition that watch the PHP memory limit, so that Tideways always automatically deactivates detailed tracing if the request goes above 90% of the memory limit (configurable).

As for backwards compatibility version 5 is mostly a drop in replacement. Unfortunately, there are two necessary BC breaks in the extension and a few deprecated features that got removed.

Read More: BC Breaks and Removals in the new PHP Extension

What’s next?

This release includes a large amount of new features and changes to existing functionality, but we couldn’t include everything that we wanted without delaying for several additional months. Stay tuned in the next months to see updates on long term requested features such as trace triggering improvements, weekly report, alerting and more thorough usage of the downstream service/layering data.

New: Downstream Service Monitoring

Having detailed response time percentiles and impact analysis for transactions is great. But often it’s not the php application that is causing unwanted spikes in response times rather than services used by your application, such as MySQL, redis, HTTP APIs and so on.

As of now, you can see problems with these ‘downstream services’ at a quick glance:

Downstream services include the following layers so far:

  • SQL (PDO, ext/mysql, ext/mysqli, db2, oci8)
  • Memcache
  • Redis
  • MongoDB
  • File I/O (all local file operations)
  • Queue (beanstalk, amqp)
  • HTTP (all HTTP communication: includes external APIs, elasticsearch, …)

It’s worth noting that downstream services is taking all requests into account, not only those with sampled traces. This was made possible by our new and completely rewritten php extension (version 5.x).

How do I get Downstream Services?

Just update tideways-php and tideways-daemon to the newest versions and the data will be collected automatically. No separate configuration is needed. Until September you need to update your Apt or Yum repository endpoint to our new location to get version 5.

New Tooltip Information

Downstream service layers are integrated in a second graph on your application’s main performance view, showing average response times and what percentages are allocated by the different services. All relevant information was added to the existing tooltip: you can see percentiles and average response time, as well as the number of errors occurred and all downstream service timings. If a single service makes up more than 30% of the total response time, it is specially highlighted (e.g. SQL in the screenshot above).

Average vs. Percentile Response Times

Percentiles are really good for spotting negative outliers in your requests, but you cannot stack percentiles correctly: e.g. 95% percentile for SQL + 95% percentile HTTP might be larger than the 95% percentile of the overall response time. That’s why we display downstream services in a separate graph, using average response times. As a bonus, you can now compare percentiles with average response times side by side.

What’s next?

We have already more ideas, what to do with downstream service data.

Downstream services data can be displayed per transaction when you upgrade to the “Pro” plan, giving you even more insight since service usage within one transaction is usually quite consistent and spikes in a single service most likely indicate problems with that service.

To get a better feeling for long time performance trends we plan to incorporate downstream service data in daily/weekly/monthly history views, as well as the weekly reports. We are also evaluating the possibility to use downstream service data for additional alerting options.

Also, we are testing the idea of specialized views per downstream service layer, to give you a completely new perspective on your performance data, e.g. analyzing SQL performance in detail.

These new features will be added within late 2018 / early 2019, we will keep you posted!

Releasing New Tideways XHProf Extension

We have just pushed the beta of a new version 5.0 of our XHProf fork to Github. It is rewritten from scatch with a modern code-base that makes use of PHP 7 internals and includes major datastructure improvements.

Tests with a WordPress installation show callgraph profiling overhead to decrease by 20-50% for this new extension. The extension also moves several data transformation out of your applications hot execution path so that individual function calls should have more accurate measurements.

Your own improvements may vary based on your code base, hardware and usage patterns, but every use-case should have significantly less overhead than before.

Separating XHProf and Tideways extensions

With the 5.0 version of the Tideways PHP extension, we are separating the open-source extension to generate XHProf compatible profiling data from our own timeline/tracing Profiler, so we can work on improving them independently.

This is why the now released Tideways XHProf open-source extension has a new name tideways_xhprof, while the existing extension name tideways will continue to be used for our software as a service / product.

As an open-source user of Tideways, an upgrade to the new version requires you to slightly change your code to adjust for the new extension and function names:

 <?php

-if (extension_loaded('tideways')) { -    tideways_enable(TIDEWAYS_FLAGS_CPU | TIDEWAYS_FLAGS_MEMORY | TIDEWAYS_FLAGS_NO_SPANS); -    tideways_disable(); +if (extension_loaded('tideways_xhprof')) { +    tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_CPU | TIDEWAYS_XHPROF_FLAGS_MEMORY); +    tideways_xhprof_disable();  } 

In addition the extension needs to be loaded by its new name extension=tideways_xhprof.so.

We are sorry this separation couldn’t be done in a backwards compatible way. You can keep using the old tideways extension from the 4.x branch of Github, but we will not update it for new PHP versions anymore and you don’t benefit from the performance improvements.

One immediate benefit arising from this is Windows support for all versions of PHP 7.0, 7.1 and 7.2 for both NTS and ZTS. You can even download pre-compiled binaries from AppVeyor Artifacts tab of each build.

Because parts of this code-base is shared with our own new tideways extension and we want to continue to give back an open-source based PHP Profiler to the community, you can expect us to continue the support of this extension in the future. We plan to extend its compatibility to more platforms and adapt it to Zend Engine changes for future PHP versions.

No changes for Tideways Customers

Are you a tideways.io customer? Then nothing changes for you. Install and upgrade the tideways extension from our list of prebuilt packages on the download page. You can find the old extensions source code in the 4.x branch on Github. The tideways-php dpkg and rpm packages from our package repositories will always ship only the tideways extension used with the service.

The new tideways version 5.0 extension will be released in the next weeks and we will make a dedicated announcement about this release and all its improvements.

Improved Dashboard with Preview Chart and Recent Performance Metrics

We have improved the dashboard in Tideways to include preview charts with the last 24 hours of performance data and the performance of the most recent 15 minute interval. This provides you with a much better overview of all your applications and by selecting any time range in the preview chart you can directly jump to a time-range that interests you.

New Dashboard with Preview Charts for demo organizationNew Dashboard with Preview Charts for demo organization

In this screenshot you can see the dashboard for our current set of five demo applications.

This feature is immediately available for all applications with Lite, Basic and Standard licenses (not staging applications) and for all old request-based plans of sizes “Small”, “Medium” and “Large” (not for the “Extra Small (XS)” plans).

Introducing SQL and HTTP duration trace filters and advanced query language

Finding a specific trace you are interested in just got much easier with the addition of three new filtering features.

  1. You can now filter traces by duration or amount of executed SQL and HTTP queries in a trace:

    This allows you to find traces with SQL or HTTP behaviour that you are interested in.

  2. You can now view a list of the last 100 traces that you have looked at, or even filter it by additional criteria. You can find this option in the “User:” filter under the name “Last 100 viewed by me”.

  3. We have introduced a query language that allows you to filter by any field using a more complex set of operators and with the help of AND/OR conditions, to find exactly the traces you are looking for.

    You can find more details about the query language in the documentation.

In combination the response time, bottlenecks, events and service filters that we added last month, you now have much more filters at your disposal to find and fix problems in your application.

We are looking foward to your feedback and if you have ideas for new filters we are happy to hear from you, as we want to keep adding more filters in the future.

Profiling Laravel applications using the open-source Monica CRM as example

Tideways has powerful built-in instrumentation for Laravel, including Eloquent Models and Blade Templating language. To show this support we have added a demo application using the excellent open-source Laravel application Monica – a CRM for your friends and family. You can sign up for Tideways for free and take a look at this and other demo applications.

The Laravel demo is running on Heroku and using the Heroku composer package for Tideways. Pre-populated with some demo data, we run a complex Siege scenario to generate traffic on various read and write actions every minute.

Tideways framework detection automatically monitors performance, memory usage and requests from individual Laravel controllers and actions, with no code changes necessary:

Transaction performance of Laravel Application Monica CRMTransaction performance of Laravel Application Monica CRM

When you drill down to transaction traces, you can see the performance timeline of individual requests filled with detailed information about Laravel Events, Eloquent Queries and Blade Template renders.

In this trace for the People::edit controller, we can see that bootstrapping and loading the user object from the session takes the first third of the request, the controller itself takes roughly a third and then the view takes the last third:

Profiling Laravel Elqouent and Blade TemplatesProfiling Laravel Elqouent and Blade Templates

Clicking on the Eloquent User model timespan, you can see details which kind of operation was performed on the model:

Profiling Laravel Elqouent QueriesProfiling Laravel Elqouent Queries

And for the template you can see its filename:

Profiling Laravel Blade TemplatesProfiling Laravel Blade Templates

Tideways provides other Laravel specific instrumentation such as Session garbage collection, service provider bootstrapping time and the duration of all Laravel events. As a result you are always fully informed about the performance of your Laravel application and which performance problems to fix for the biggest improvement.

Try Tideways on your own Laravel applications and sign up for our 30 days free trial.

Filter traces by bottlenecks, response time, service and release events

We just improved the trace listing screen in Tideways and included four new filters.

First, You can now filter down traces based on the bottlenecks Tideways detected, for example slow or N+1 SQL queries, excessive compile or garbage collection times.

Second, you can filter traces by Release version. If you are using the Event API to create releases whenever you deploy a new version of your code, then you can now find all the traces that were collected during one or more releases.

Third, you can filter traces by Response time. Currently we support 5 common ranges, for example 0 – 50ms and 50 – 250ms. We are working on more advanced filter possibilities to allow any range that you want to filter for.

Fourth, you can filter traces by Service they where collected in.

As we are adding more and more filters, we have also improved the user interface to only show the filters that you are currently using. By clicking on the “Filters” button you can see a list of all existing filters and toggle the ones you need for your current task.

New Integrations: PagerDuty and Generic Webhook

We have added two new integrations for Tideways in the last days that can receive notifications for Response Time Degradation, Error Rates, New Exceptions, weekly Reports and new releases.

The first one is for PagerDuty, an incident management platform. The support is similar to the one we have already for PagerDuty’s competitor OpsGenie.

The second one is a generic Webhook integration, where you can push the notification payload via HTTP POST to an URL of your choosing. The documentation page shows all the supported payloads with examples so that you can integrate Tideways with your own code as you see fit.

View the code context for the stack trace of exceptions/errors

We have released a new opt-in feature that allows the collection of code around every part of an error/exception stack trace. This feature is disabled by default. When enabled the Tideways daemon stores 10 lines of code around each step in the stack trace of an exception or fatal error.

You can enable this setting in the “Application Settings” screen for every application that supports Error/Exception tracking. It requires a tideways-daemon in version 1.5.4 or higher to take effect.

Sending code along to Tideways is tricky and for security reasons we strip the contents from single- and multiline string literals, herdocs and nowdocs directly on the daemon before sending them to us. Inconclusive blocks are completly ignored and never sent to our servers.

Introducing unlimited request plans

We are introducing new plans for Tideways and are retiring the request-based pricing on March 15th 2017. You can already visit the new pricing page with all the information.

New plans are billed per application and include unlimited monitored requests from unlimited servers. Tideways is primarily an “Always On” production profiler and tracing system and therefore pricing is now heavily influenced by how many traces we collect every minute and how long we store them for you. With the new plans, you decide on an upper limit of detailed traces collected from an application every minute, for example 25 traces/minute – which translates to roughly 1 million traces a month. Each new plan has a number of included traces/minute, but you can also increase the traces/minute limit in steps of 25. With this model, you have guaranteed fixed monthly prices you know in advance, based on your desired level of traces/minute, but independent of application size, architecture and host count.

If you are using Tideways as a traditional Profiler to manually generate Callgraph profiles, you will also be happy to hear that we increased the retention for manually triggered traces to 30 days, regardless of the plan. In the Lite plan this includes 10.000, in the Basic plan 25.000 and in the Standard plan 50.000 triggered callgraph traces per month. You can also purchase a dedicated upgrade to increase the retention to 60 days and add 250.000 additional callgraph traces/month.

For existing customers we are grandfathering all current plans and give you the choice to stay in your current plan or upgrade to the new plans if they suit you better.

What are the new prices? A Lite application with limited APM functionality and 24 hours retention costs 39€/application/month, the full APM functionality is available in either a Basic application with 3 days of retention starting at 89€/application/month or Standard application with 14 days of retention starting at 159€/application/month.

What is my benefit switching to the new unlimited request plans?

Our goal with these new plans is to make it simpler for you as a customer to calculate your Tideways costs up front and independent from month to month changes caused by server up- and down-scaling, seasonal business and application architecture. You decide on the level of visibility you want into your application and the duration we store this data for you and we optimize everything else. Instead of monitoring costs that directly scale with your application request volume, you can now decide yourself when and why to increase the amount of traces/minute because your application has grown in code-size and functionality, production traffic or both.

This is the next step away from the per-server pricing that many of our monitoring competitors sell. We think both servers and requests are a bad proxy for the value that you or your customers get from monitoring a particular application. Especially in this age of multi-cores, microservices, Docker and vertically scaled applications for increased reliability. You shouldn’t be punished for your choice of deployment technology, host topology or application architecture. With the new plans we can offer fair prices to customers that run on a single server and want to keep hundreds of traces every minute and customers that run on 10+ hosts but are fine with only a very limited visibility.

When you are upgrading to the new plans the minimal traces/minute configuration of 25 traces/minute for a basic plan is higher than the previous limit of 20 traces/minute that we built into the old plans.

I am not convinced, can I keep my old plan?

Yes, you can! We are grandfathering your current plan. You can continue to upgrade within tiers of the old per request model. You cannot subscribe to the old plans if you are not yet a customer. We do reserve the right to provide new features for the new plans only.

Remember that the new plans are designed to increase the visibility in your application, they store a higher amount of traces every minute than Tideways did before. Upgrading will give you access to more traces and better insights.

How does this affect Microservice/SoA architectures with multiple applications in Tideways?

We have released a new feature called “Services” last month, which allows you to collect data for a microservice/SOA-architecture into one application in Tideways and view performance statistics for each service individually. We suggest that you migrate your deployment to using services instead of multiple applications. Since this feature is only available to Medium (M) plans, if you have this problem and are subscribed to a Small (S) or Lite plan, please contact [email protected] and we activate the feature for you to prepare for a plan upgrade.

I have many tiny applications and the new pricing per application is bad for me

Unfortunately, if you have monitored dozens of tiny applications with a 3S or 10S plan before, then this pricing change will affect you the most. We realized in the last months, that for many features, continuous processing is necessary at the application level and unlimited applications is therefore not scalable for us with the current pricing. You will be able to support 4 applications (1 basic license + 3 staging licenses) for 69€/month if you are fine with just the bare minimum of monitoring visibility. Or you can just stay in the old pricing if it works better for you.

What about my staging, testing, QA and development environments? I have created additional applications in Tideways for them.

Both the Basic and Standard plan include 3 staging applications for free that you can use to collect this information without having to pay extra. This allows you to create applications for development, staging and testing environments. A staging application has 60 minutes retention, but has all the same features as a basic or standard application.

How is it possible to offer a fixed rate for unlimited monitoring on unlimited hosts?

The idea of unlimited request and server plans is in our minds for a while already, but it required a greater part of the backend engineering effort last year to support this offer. Our new data structures and processing pipeline is designed in such a way that a simple and lossless aggregation per minute is possible directly when collecting data on the daemon running on your server and again when we accept the data on our backend using an aggregation proxy. This is possible with the way we use HDRHistogram and several storage optimizations as explained in this previous post on our blog. Almost no aggregation or computations are necessary for data on our backend, we just store them on disk and index them in a database. We also automatically reduce the amount of monitoring detail for the long tail of transactions with very few requests. This way it doesn’t make much of a difference in terms of processing and storage if you have just one host, or hundreds of them. It does have the downside that monitoring data is only application-centric, not on the server-level, but we think that application-centric monitoring is much better suited to understand your the experience of your users anyways!

Improved time-range selection with the new preview-chart

We are rolling out another new feature that has been high on our most wanted feature list for a while, a time-range selector using a small preview-chart with the response time trends of your application.

You can now select the time range you want to investigate directly from the preview-chart and all the other views with the detailed graph and transaction performance update automatically. Selections are a minimum of 60 minutes and a maximum of one day. You can use the scrollbar below the preview-chart to see the full timeline, which is important if you have a retention of 14 days. If you drag on the edges of the scrollbar, you can zoom-in or -out of the selection.

Kore and Sina jointly worked on this feature over the last 6 weeks as both frontend and backend required many changes and feedback loops to get the user experience and performance right for our existing scale.

As a boring technology company we had to make a difficult decision to introduce Redis as a new database into our stack, because its datastructures make it very suitable to store this the full data for each preview-chart as a list for very quick access.

For now to keep the operational risk low, we have set Redis up purely as a cache and the preview history can be re-created from our time series storage Elasticsearch all the time. The UI can also fallback to the old dropdown time selector when Redis is not available.

Slack, Hipchat and Flowdock notifications for new releases

If you are using release events in Tideways to mark deployments of your application, then you will happy to hear that we have finally created notifications for them. Starting with Slack, Hipchat and Flowdock, you can now get a notification in two cases:

  • The release was just deployed (and a Tideways event was created for it)
  • Around 90 minutes after the release, when a before/after report is compiled.

You can see those events in action for our Slack integration in these screenshots:

To activate release notifications, go to “Application Settings”, then “Configure Notifications” and create a notification rule for “New Release”. You can decide if you want to get the 90 minute later report only if the performance dropped, but by default you will always see it.

Introducing Services: Monitoring micro-services, CLI scripts and workers separately

Your web applications usually runs in multiple contexts: the webserver, inside workers and as a cronjobs and it might even include calls to other micro- or SoA-services.

Today we introduce “Services” in Tideways, a feature that allows you to group transactions into multiple services that are part of a single application.

This feature is used through configuration on the PHP side by either setting an INI variable (or environment variable TIDEWAYS_SERVICE):

tideways.service=api 

Or programatically from within your code by calling:

TidewaysProfiler::setServiceName('api'); 

This will automatically start aggregating data on the new service called api and the data will be visible in the UI with no further configuration necessary. It will also show aggregated performance data for every transaction within a service. By default all requests are tracked in the service web and if you enable the tideways.monitor_cli=1 setting, then all CLI scripts are monitored in the service cli.

Before we introduced this feature, the “workaround” has been creating mutiple applications for each service, but since there is no way to connect data between multiple applications, you had to look in many places and connect information yourself.

By making different services within an application a first-class citizen in Tideways we can now work on connecting the dots and uncover this information automatically.

Please read the “Configuring Services” section in the documentation for more information on how this feature works.

“Services” are available to all customers with a medium plan (3M and up). You need to update the PHP extension to v4.1.1 and the daemon to v1.5.3 to make use of this feature.

Receive Weekly Report in Slack, Mattermost, Flowdock or HipChat channels

We are expanding our support for notifications about your applications performance with a Weekly Report notification that can be sent every Monday morning to Slack, Mattermost, Flowdock or HipChat.

Just go to your “Application Settings”, then “Configure Alerts” and then “Create Alert Condition”. You can select “Weekly Report” in the drop down and select your target notification channel.

We have prepared some example screenshots of the notifications.

In Slack:

In Flowdock:

Next Monday morning will be the first day these reports are sent, so set it up quickly to be one of the first users of this feature.

If you want to rely on the Chat Notifications entirely you can also disable e-mail based notifications for individual applications now.

Improved History View, Traces including Server Metrics

After a slow December of vacation and holidays we are slowly picking up steam again and are releasing the first new features of 2017 with an improved history and server metrics for traces.

History

The historical performance data that we collect for your application has been well hidden until now and was reached by clicking on links in the weekly report e-mail. Starting today, the history is more prominent and includes more features and data.

We have now enabled the “slim history” that is directly visible from the application overview and shows you the performance from Yesterday, Last Week and Last Month for comparison.

When you follow the links to the history view, then you can now see a more dynamic chart of the performance data and a new histogram that shows the full response distribution.

In addition to the weekly report you can now also view the historic data by day or month. Just use the select dropdown to toggle between the different views.

Server Metrics for Traces

The latest version of the Tideways daemon now collects server metrics on CPU load, memory, I/O and disk usage during the execution of the trace. This information can be viewed directly from the trace details by looking at the main timespan details box on the right.

Using HTTP client timeouts in PHP

Timeouts are a rarely discussed topic and neglected in many applications, even though they can have a huge effect on your site during times of high load and when dependent services are slow. For microservice architectures timeouts are important to avoid cascading failures when a service is down.

The default socket timeout in PHP is 60 seconds. HTTP requests performed with for example file_get_contents, fopen, SOAPClient or DOMDocument::load are using this timeout INI setting to decide how long to wait for a response.

Since the socket/stream wait time is not included in PHPs max execution time you are in line for a surprise when requests take up to 30+60=90 seconds of your webservers precious processing queue before getting aborted.

Timeouts are scary, because you don’t know in what state you have left an operation when aborting. But in case of HTTP requests it is usually easy as a client to decide what to do:

  1. Abort my own request and show the user an error
  2. Ignore the timeout and just don’t display the data
  3. Retry (a maximum of 3-5 times for example)

And configuring timeouts has other upsides:

  • If the target server currently has load problems, then aborting with a timeout early could reduce the servers load enough to automatically recover at some point.
  • You can show users an error quickly and they don’t have to wait several seconds only to be taunted by an error page.

Setting the default timeout

Before doing anything else, you should decrease the default timeout early in your code to a value between 5 and 10 seconds:

<?php

ini_set("default_socket_timeout", 10); 

You should check your monitoring system (for example Tideways) for clues what a regular HTTP call duration is for calls to internal or third party systems.

If you have many different internal or third-party services in place, then it makes sense to configure individual timeouts based on their usual latency.

A thorough setup defines maximum limits for each internal and third party service and then encodes them in HTTP calls.

Configuring the timeout for individual file_get_contents/fopen calls

In stream based calls you can configure individual timeouts using stream contexts. This applies to for example file_get_contents and fopen:

<?php

// timeout of one second 
$context = stream_context_create(array('http' => array(
     'timeout' => 1.0,
     'ignore_errors' => true,
)));

$data = @file_get_contents("http://127.0.0.1/api", false, $context);

if ($data === false && count($http_response_header) === 0) {
     // request timed out, because $data is false even though we ignore
     // errors and we dont have response headers 
} 

Be aware that the timeout handling of streams seems not very accurate and requests can still take longer than you configured, especially when you go below 1 second.

Configuring the timeout for DOMDocument::load

In general you should not use the DOMDocument::load function to load remove XML or HTML. To allow for better error handling code it’s easier to use a HTTP client directly and then load with loadXML. But if you must use it or some library does, you can configure timeouts with stream contexts again in this way:

<?php

// timeout of one second
$context = stream_context_create(array('http' => array('timeout' => 1.0)));

libxml_set_streams_context($context);

$document = new DOMDocument();
$document->load('http://127.0.0.1/xml'); 

This affects all HTTP calls that PHP does through libxml.

Configuring the timeout for SOAPClient

The SOAPClient class does not use the PHP stream API for historical reasons. This means that timeout configuration works slightly different. Setting the timeout parameter in SOAPClients stream context does not work.

Instead you can either set the connection_timeout setting that handles timeouts before the connection was established or directly set default_socket_timeout in the code using ini_set. The only other way is to overwrite SoapClient::__doRequest method to use cURL.

<?php

ini_set('default_socket_timeout', 1);
$client = new SOAPClient($wsdl, array('connection_timeout' => 1));

try {
     $client->add(10, 10);
 } catch (SOAPFault $e) {
     if (strpos($e->getMessage(), 'Error Fetching http headers') !== false) {
         // this can be a timeout!
     } 
} 

Configuring the timeout for cURL extension

If you want to have more control about HTTP requests than with PHPs built in stream support there is no way around the cURL extension.

We have much better timeout control with cURL, with two settings: one for the connection timeout and one for the maximum execution time:

<?php

$ch = curl_init('http://127.0.0.1/api');
curl_setopt($ch, CURLOPT_TIMEOUT, 2); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);

$response = curl_exec($ch);

if ($response === false) {
     $info = curl_getinfo($ch);

    if ($info['http_code'] === 0) {
         // timeout
     } 
} 

If you want to be more strict and abort on a millisecond level, then you can alternatively use CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS constants, but the manual warns that this might still only be checked every full second depending on how cURL was compiled and setting a value below one second usually requires to ignore signals with curl_setopt($ch, CURLOPT_NOSIGNAL, 1); to avoid an immediate timeout error.

One important thing to remember is cURL has an indefinite timeout by default and does not obey the default_socket_timeout INI setting. This means that you have to configure the timeout in every cURL call in your code. With third party code this might even be complicated or impossible.

Improved snapshots: Select and compare any time span, drill down

When the performance of your application changes you want to know the reasons why. In the last month we have kept relasing feature after feature that makes this easy and quick and Snapshots was one of them.

Clicking on any bucket in the application performance graph opens up a a view of the performance happening at the exact minute you selected.

Today we have significantly increased the value of this feature.

You can now select more than one minute in the application performance chart to view a performance snapshot of the entire selected time range. Keep the mouse pressed on the chart and start dragging it over all the time bucktes you are interested in.

The snapshot view then shows the response time, request amount, errors and details for each transaction in the selected time frame. Data from the snapshot is then compared to the values of the full time interval, which allows you to spot the outliers immediately.

If you then drill down into one of the transactions, you see the same time range immediately selected in the snapshot and the second box with the histogram shows performance data for just the requests happening in the selected time range.

This includes median, average, max and all percentile values for requests that happend during the selected time range.

Introducing Trace Pinning

Today we are introducing a new feature called “trace pinning” which allows you to keep traces for future reference. This is a first step to improve the usability of Tideways for longer performance optimization sessions by simplyfing the steps to find traces that you have found interesting before.

A pinned trace is stored for a much longer time, 120 days for the Medium and Large plans and 7 days for the Small plans and is shared between all users in the application. The limit of pinned traces is currently set to a maximum of 50 traces per organization every day.

To pin a trace that you want to keep for reference, you just have to click the “Pin” button on the far right of the menu when looking at it:

Pinned traces are then highlighted in different places of Tideways:

  • When comparing traces you can pick the compare target from all the pinned traces for this transaction first. See the screenshot below for an example.
  • When looking at the transaction details the last pinned trace is always shown first before all the most recently collected ones.
  • When searching for traces you can add a filter to show only pinned traces.

Please let us know how this new feature works for you, at this stage we are open to suggestions for further improvements.

Developing a time-series “database” based on HdrHistogram

Over the last months we have developed, tested and rolled out a new backend for the time-series information that we collect in Tideways. In this blog post I want to explain some of the implementation details and the journey getting here and why we didn’t use one of the many existing time-series databases out there.

The past: Time-Series with Elasticsearch

Since the first prototype of Tideways we have used Elasticsearch for storing latency measurements of monitored applications. The decision for Elasticsearch was heavily influenced by ease-of-use over everything else. When building the prototype in 2014, one requirement was that we wanted to calculate percentiles of the latency distribution and skip averages all together, because of their many flaws in performance analysis (topic for another blog post). At the time we already used ES for storing and searching trace data, so we made the naive decision to use it for time series data as well. To counter potential data loss with Elasticsearch we made the decision to keep an event log of all data written and implemented a replay mechanism which safed us from trouble several times.

As a single purpose tool for monitoring latency and profiling, we don’t need to collect thousands of time-series per server every minute, and Elasticsearch works quite well for us on this scale. We did encounter our share of problems and had to learn a lot before efficently operating Elasticsearch as a time-series database, but with a cluster size of never more than 300GB we are far from the “webscale” regions yet but we knew that the current backend implementation wouldn’t get us much further. We also felt some growing pains:

  • Using the percentile aggregations, for some of our customers with 18000 requests per minute, it means about 30 million data points for only one day and performing the calculations took in the range of several seconds, sometimes more than 30 seconds.

  • Storing one document for each request is extremely inefficient, even if Elasticsearch compresses storage effectively. Every day we collect in the range of 500 to 1 billion documents.

  • We can’t store this amount of data for longer than a few days (3 at the moment) so we need expensive aggregation workers that compute aggregations over all endpoints all the time, into different dimensions. If you know a little bit about statistics, once you start aggregating calculating with percentiles is not possible anymore, which forced us to do something very wrong: averaging of percentiles in some places. We also needed to aggregate into multiple different target formats, because our datastructures where naively implemented. Every minute up to 6000 aggregation tasks where performed, causing quite a bit of stress on our backend workers and Elasticsearch cluster.

  • Our daemon on each customers machine already aggregates data into 1 minute intervals, before we deaggregate this again on the backend to allow Elasticsearch to calculate percentiles on it. This felt very inefficient.

  • Due to the massive amount of unaggregated and aggregated data, we are still offering quite a short data-retention period of only up to 14 days. We want to increase this but not at the current data storage efficency.

Looking for a solution using Histogram datatypes

So our next solution needed to be better on several dimensions:

  • Fix the aggregation overhead
  • Avoid the use of wrong math when calculating percentiles
  • Store data more efficiently
  • Decrease query response times even for long periods of more than 24 hours.

So when I came across datatypes for histograms, especially HdrHistogram I know I was up to something. Histograms are the perfect datatype for storing latencies.

A histogram is an (almost) lossless datatype where we count the number of times a request takes in predefined buckets. For HdrHistogram this works by specifiying a fixed range (1 to 60000ms in our case) and a factor for preciseness that defines small buckets of 1ms steps in the beginning but the larger the range the larger the steps between buckets get.

The benefit of histograms is that you can add many of them together and still compute the exact value of any percentile.

The first step was to find an existing open-source timeseries database that supported storing histograms, but sadly only Prometheus (to my knowledge) does this and its pull metrics model is too different to our current push model that we could easily integrate this in our existing stack without a full rewrite.

Every other time series database stores each measurement individually. Which is completly useless for our latency numbers in pre-aggregated 1 minute intervals. It seems most time-series databases are not primarily written to store latency numbers but instead general purpose time series.

After about a year of contemplation about this problem (remember, we didn’t actually need to improve for scale yet) we decided to implement this ourselves on top of an existing database two months ago.

This was not a decision made lightly, but we figured implementing this for just our special purpose and stored using existing database technology, we would end up with a very small and maintainable codebase to implement this.

Our new timeseries backend

In my head, the ideal solution to combine HdrHistograms and a database looked like this:

  1. The daemon already collects latency data as histogram datatype on the customers servers.
  2. When passed onto our servers we would just store the histograms in a database on our end without having to process the data to make Elasticsearch percentile queries work.
  3. No aggregation workers are necessary anymore, because we already store aggregated data.
  4. As a downside, computations have do be done in code, because no database exist that can do histogram additions directly itself.

For the first prototype we took the C port of HdrHistogram by Michael Barker and wrapped it in a PHP extension since all our backend is in PHP. We then built a second implementation for the service storing and querying our monitoring data and came up with something just short of 600 lines of new code. Our daemon does not aggregate Histograms itself yet, this is a next optimization step for the future.

Our new backend now works this way:

  1. We store one serialized HDR histogram per observed transaction/server/minute. Some small optimizations reduce the required space for histograms with only a few observerations.

  2. For every group of transactions (web, backend, crons, …) we also store one histogram with all requests that is displayed on the main page of the application.

  3. For every server/minute we store a ranking of all transactions by “impact” (Sum of all response times as share of total) that can be added up again over arbitrary periods of time without having to use “wrong math”.

  4. Queries fetch all histograms in the selected date interval (several thousands if necessary) and adds them on the fly.

All this is still done in Elasticsearch, because it is readily available and we could just plugin our pre-existing abstractions to manage retentions, rotating indexes, clusting and everything else we didn’t want to implement ourselves for now. Technically we don’t need ES anymore, but we keep using it for now, because its easier to use something that already exists.

The solution is so small because we are literally standing on the shoulder of giants here and just plugging two different technologies (HdrHistogram and a database) together.

Results

Using a feature flag we were live with the new backend for a small number of test customers with amazing results:

  • We reduced the required storage space to at least 12% of the original amount.

  • We reduced query times for large periods to consistently under one second, no matter how big the customer is. This is a massive improvement over the really bad 30-45 seconds some of our customers had before for periods >1 day. Using a C-based PHP extension for summing up many histograms helps with the performance.

  • Aggregation workers are not necessary anymore, saving up to 6000 worker tasks per minute at the current workload.

  • Customers with high data retention can now still look at data in one minute intervals for their whole available dataset. No aggregation to one hour buckets anymore for everything older than 3 days.

On top of this we can improve some of the existing features by exposing more detailed information.

After a month of testing this in beta customers and ourselves, we are now slowly rolling it out to all customers.

Future

The next step for the backend is looking into optimizing storage even more. For example we could aggregate histograms into one per transaction/minute if there are more then one server. This could potentially save a lot of data for customers with lots of servers, which are usually the ones sending way more data anyways.

Another thing we want to look into is making the backend more available than Elasticsearch is by default. We will probably try this by using a different underlying database first or even implementing our own special purpose database. We only use Elasticsearch as dumb storage right now, so it should be easy to switch to MySQL/PostgreSQL or any NoSQL database that allows range queries. Building something our own is out of the question.

Ideally at some point we want to extract the code base into a small microservice, since its now entagled into our monolithic backend service.

Of course, I hope to inspire others reading this to jump into building an open source version or integrating HdrHistograms in one of the existing time-series databases 🙂

Adding CakePHP Support for CakeFest

For this years CakeFest in Amsterdam we have finally finished native support for both CakePHP 2 and 3 in Tideways. First, we have added automatic transaction/endpoint detection based on Controller and Actions as you can see in this screenshot where we are viewing a trace for AppControllerPagesController::display of the open source project stillmaintained.

Furthermore Tideways automatically detects a span with the duration of each controller:

And it detects the duration of how long a CakePHP Template was rendered:

Finally, dispatched events happing inside CakePHP applications are detected and rendered into the timeline similar to event support for many other frameworks. You can see an example with Dispatcher.beforeDispatch and Controller.startup in the timeline above .

With support for PDO, MySQL(i) and PgSQL already baked into Tideways you now get a comprehensive view of how your CakePHP based applications are performing.

If you want to test CakePHP support drop us a note at [email protected] and we give you access to the beta version (v4.0.5) of the PHP extension. If you can wait a bit, the stable version will be released next week.

New: Profiling PrestaShop performance

We have included PrestaShop 1.6 and 1.7 support in the last release of the Tideways PHP extension. If you are using Tideways with your e-commerce site based on PrestaShop, then you now get better insights for monitoring and profiling data. No changes to your code-base are necessary to get started.

The PHP extension now automatically detects the name of transactions based on PrestaShop controller names, as you can see in this screenshot of our Presta demo shop:

You need to set the framework configuration in Tideways to PrestaShop (php.ini Example):

tideways.framework=presta16 

Additionally, we now detect PrestaShop events (HookCore::exec) and controllers in a timeline trace. See the dark blue CategoryController span or the light blue displayHeader event span in this screenshot to get a feeling how it works:

Support for tracing PDO with MySQL and Smarty was already in Tideways before and you can make use of them, when optimizing the performance of your PrestaShop.

P.S. Start a 30 day trial of Tideways to test PrestaShop support.

Introducing Teams and Synchronization of Members from Github

We are introducing “Teams” today, a new feature to improve access controls for your Tideways organization, after several weeks of testing with selected customers.

With Teams you can grant more fine-grained access to your applications, based on team membership of your users. Additionally this feature allows you to automatically synchronize teams and member accounts from your existing Github organizations and save a lot of work on user maintenance.

Until now Tideways had a very simple access control system that allowed admins to invite as many members as they want into their organizations and those members are able to see all applications. For big organizations this is usually not good enough and the manual invitation process is very time consuming and requires care when persons leave the organization.

The team feature is available for organizations with Medium plans (20M+). For our Tideways On-Premise solution, this feature will allow you to synchronize teams from LDAP. The Teams feature is entirely optional and you can still use the simple ACL model from before if you don’t need this much control.

Please see the documentation for more information about how to use it.

Improved Error and Exception Tracking

In the last weeks we rolled out several new features for Error and Exception Tracking in Tideways that we have been missing ourselves in the day to day work.

Tideways can now trigger alerts for you when a new type of Exception or Error occured in your application. This is extremely helpful to be up to date with new sources of problems surfacing in your application. Configure these alerts to notify you on Slack, OpsGenie, HipChat, IRC, Flowdock or the classic choice with E-Mail notifications, like this example:

New Exception E-Mail ExampleNew Exception E-Mail Example

For errors that you do need to investigate further we have added new features as well. First, you will now see a chart of the occurances of this error in the last 24 hours. This can help you find out how frequently the error is happening.

Error Occurances ChartError Occurances Chart

Another new feature Context information about errors, a list of additional information available for debugging the problem. You can pass this information to Tideways from your application using the customization APIs. An example for useful context information are the URL, user id, current users items in a shopping basket, users activated feature flags or A/B testing groups.

Sometimes Exceptions in your application are not exceptional, but just regular error conditions that don’t require further investigation. One such example is Symfony’s NotFoundHttpException which just indicates a 404. You can now ignore exception classes application-wide, when you think they don’t want to see them anymore.

To ignore an exception click “Not Error” first, then wait and click again when the button turns red and shows “Always Ignore”.

Always Ignore ExceptionAlways Ignore Exception

Once an exception is ignored it will never appear again in the list of errors, won’t trigger alerts when it re-occurs and doesn’t count towards the global application or transaction error rates.

At last, we have fixed a bug that could lead to stacktraces not being reported in exceptions and errors. You need the daemon in the latest version (v1.3.7) to see stacktraces again.

Flowdock integration is now available

Integration with Flowdock is now available in Tideways. If you are using Flowdock for chat ops in your business you can now send alerts for performance regressions and increased error rates to a Flowdock Stream. This allows you to have a discussion and response handling for every incident.

We are offering some context information for every incident directly in Flowdock and you can directly jump to the Tideways view of an incident by using the context menu inside Flowdock.

For more information about the Flowdock integration see the corresponding Guide.

PHP 7 Release of Tideways

We are happy to finally release the first PHP 7 compatible version of Tideways after several months of beta testing with customers and open-source users. A new version of the extension has been released with the major version 4.0.3 that works on Linux for now. We are still working on publishing releases for Mac and Windows platforms in the next days. You can find binary downloads as Tarball, Debian, RedHat and Homebrew packages or the source code in the master branch of our repository on Github.

On top of the work we did porting the extension for PHP 7, there is also a new feature that we could implement, based on the Turn gc_collect_cycles into function pointer RFC that I have successfully proposed into PHP 7 together with Adam Harvey. Our Timeline Profiler now shows timespans for Garbage Collection and the function context they occur in, like the black span in this timeline trace:

The Tideways extension also serves as a replacement for XHProf callgraph profiling and has a compatible API and output format, you can use this extension outside our product to profile your PHP 7 applications with one of the many open-source UIs.

With this release, we are happy to finally support you monitoring, tracing and profiling your PHP 7 applications and are looking forward to users putting this into production. Happy tracing!

OpsGenie integration now available

We are thrilled to announce that our OpsGenie integration is now officially available for everyone to use. Tideways can now send Response Time Regression and Error/Exception alerts to OpsGenie and you can benefit from routing alerts through their service to avoid alert fatigue.

OpsGenie allows you to define on-call-schedules and escalation policies so that only the right persons are notified of ongoing problems. Notifications are sent through an iOS or Android mobile app, SMS or phone calls with increasing urgency. As a result, OpsGenie successfully reduces alert fatigue and inbox-spamming of alert emails.

To get the integration running, OpsGenie has published a documentation how to integrate with Tideways and we have provided a similar document with information.

As a happy OpsGenie customer ourselves it feels especially great to see this integration in use every day.

Tideways Windows Beta and PHP 7 Update

zomg! Tideways for Windows is in Beta. We didn’t expect this to happen ourselves, so imagine our suprise when all tests just passed and that DLL fell out of the build process after just one day of tinkering.

While we had a persistent number of questions for Windows support over the last year, but with nobody on the team using Windows the effort of full integration into our deployment process seemed far away.

Using the amazing AppVeyor Continuous Integration service, adding Windows support proved to be a piece of cake. The code required only some small adjustments to compile on Windows, so that most of the work was focussed on the actual build scripts and process on AppVeyor.

The Windows support is far from stable yet, but we are looking forward to gathering feedback from you about the functionality as a XHProf replacement or using Tideways Profiler. If you are interested in beta testing Tideways on Windows please drop a mail to [email protected] to get access to the binary and setup instructions.

New PHP 7 Beta for Linux

More work happened on the PHP 7 version of Tideways, including some critical bugfixes and Debian and RPM packages.

We are extremely happy now to compile both the PHP 5 and 7 extensions from the same codebase, which frees up a significant amount of our development resources as a result. Prepare to see an increase in new features, improvements and other surprises after the PHP 7 extension is stabilized in the next days and weeks.

You can directly download the Tarball, DEB or RPM packages with Version 4.0.1 Beta2 of Tideways. If you are running into trouble or bugs please send an email to [email protected].

Tideways and Xhprof on PHP 7: Beta Testers Wanted

This Thursday the long awaited stable PHP 7 version will be released and it’s hard to hide our excitement about this important day in PHP history. For us the most important change is the performance increase and we have written about two- to threefold improvements across different kinds of applications before.

In August I watched PHPs creator Rasmus Lerdorf at the Free- and Open-Source Conference mentioning just how impressive this PHP 7 achievement is: A completely rewritten engine at the core and yet almost no breaking changes that affect PHP developers.

Just hours away from the release, it shouldn’t suprise you, that we have been working on a Tideways extension with PHP 7 compatibility over the last four months.

We are now ready for additional feedback and release a beta version of the Tideways extension for PHP 7. You can help us test the extension on PHP 7

  • if you are a Tideways customer or trial user
  • if you are in need of a PHP 7 compatible XHProf replacement.

To get started either compile the extension yourself from the Git Repository using the “php7-only” branch or send us an e-mail to get access to Tarball, Debian or RPMs packages with pre-compiled binaries and installers.

All tests for the extension are passing. Until we can release a productive release we are still trying to compile the extension for both PHP 5 and PHP 7 using the same code basis. Due to the severe changes in the core of Zend Engine this is a tough problem.

If you find bugs please open an issue on the Extension’s issue tracker and we will be working to fix them.

Profiling SQL, MongoDB and more

We are excited to announce a new version of Tideways PHP extension. The release is available to all our users since last Friday.

With detailed SQL query profiling it contains one of the most wanted features. A timeline trace now shows anonymized queries when you hover over a pink SQL span:

This WordPress example request with a query on tables wp_terms and wp_taxonomy shows why the timeline traces are so valuable. They allow first class support for calls to databases, webservices and other external services mixed with PHP profiling insights.

About the implementation: The profiler extension sends all queries to your local daemon, where they get anonymized and then sent to our servers: Any potentially private data inside the queries never leaves your servers. Furthermore you have to activate the detailed analysis explicitly, giving you full control over how much details you want to send to us.

We are super happy this feature finally shipped, after a very long design, feasibility and testing phase. When we started out with Tideways last year, we were sure that SQL query profiling will be high in demand. Our first customer requested this feature in June 2014 and in the last weeks we had an increasing amount of conversations with users where you asked about SQL query profiling.

You can sign up for our demos to see SQL support at work.

N+1 Bottleneck Detection

On top of the SQL queries support we are now able to detect queries that are called repeatedly right after each other with different parameters. When this occurs there is often a huge performance drain. The solution is to refactor the code to only execute one query instead. We show this directly in the timeline by highlighting the affected span and showing details in the hover:

N+1 detection is performed on SQL queries and HTTP calls at the moment.

MongoDB Support

Next, we have included support for the Mongo PHP extension. Several of our customers have only used the custom instrumentation API for this and we are grateful to have worked with them together to bring Mongo support to core.

In this first version we display the operation and the collection it was performed on. The next Tideways version adds support for the new PHP driver that was released last week.

Magento Framework support

Magento is now on the list of supported PHP frameworks and applications. We are very happy about the amazing help from Daniel Fahlke and from Maxcluster. Their research will allow us to improve Magento support even further in the next versions.

To use Magento support just configure Tideways framework setting to specify:

tideways.framework=magento 

Predis, Pheanstalk and PhpAmqLib Support

Last but not least, there is now support for libraries that a number of our customers and we ourselves use:

  • Redis support when you use Predis PHP library
  • BeanstalkD Queue support when you use Pheanstalk library
  • RabbitMQ support when you use PhpAmqLib

As usual we will be adding more libraries in each version, depending on demand and our own roadmap.

Upgrading

We provide a documentation page with detailed notes about upgrading your version of Tideways to the current versions of PHP extension 3.0.3 and daemon 1.3.1.

As usual if you have questions or need help, please send an email to [email protected].