This is an edited transcript. For the video, see Luca Lusso on Performance Tuning with the Web Profiler module.
[00:00:00] Michael Meyers: Hello and welcome to Tag1 Team Talks, the podcast and blog of Tag1 Consulting.
[00:00:04] Michael Meyers: On today's show, we're gonna be talking with Luca Lusso, the maintainer of Web Profiler and XHProf about performance tuning applications using these really popular tools. We also have a sneak preview into some of the new developments and features that are coming in the Drupal 10 version of Web Profiler, which is coming out later this year.
[00:00:22] Michael Meyers: I'm Michael Meyers, the managing director of Tag1 Consulting. I'm based out of New York City. Tag1 is the number two all time contributor to Drupal. We build large scale applications with Drupal as well as many other technologies for Global 500s. Organizations in every sector, including Google, New York Times, the European Union, the University of Michigan, and the Linux Foundation.
[00:00:44] Michael Meyers: I'm joined today by Fabian Franz, the VP of Software Engineering at Tag1, who's based out of Switzerland. Uh, Fabian is the core maintainer for Drupal. Who oversees the development of Drupal core. He's also a co-maintainer of Big Pipe, Dynamic Page Cache and responsible [00:01:00] for many of the performance-related aspects of Drupal.
[00:01:03] Michael Meyers: And of course, our special guest today is Luca Lusso, uh, AKA lussoluca on drupal.org. , who is based out of Italy. Um, Luca, uh, been a member of the Drupal community for about 16 years now, and prior to joining SparkFabrik where he's currently the lead developer, uh, Luca was the head of software architecture at Wellnet.
[00:01:25] Michael Meyers: So Luca, welcome. Thank you so much for joining us today.
[00:01:29] Luca Lusso: Thank you. Thank you, for inviting me to this talk.
[00:01:34] Michael Meyers: Definitely. Before we jump in and talk about the modules, I thought it would be really great to give folks a little bit of a background in history. I'm curious, how did you first discover Drupal?
[00:01:44] Michael Meyers: What did you use it for? Like how did you become a member of the community?
[00:01:49] Luca Lusso: Okay. Um, probably the first website I developed with Drupal was using Drupal 6 in 2007, probably, for a university. So a friend of mine asked me to help him develop, a website for his course at the university.
[00:02:12] Luca Lusso: And, um, I look for a system to build it, and I discovered Drupal. I bang my head about 6 months to understand how to use it. Uh, but, at the end, I discover a system that was very, very powerful. At the time comparing with other systems. And so I start using it for every other project.
[00:02:41] Luca Lusso: Um, and, I joined Wellnet. It was the, my previous company that was a Drupal agency here in Italy. And from starting from then, I basically always use Drupal for everything.
[00:02:56] Michael Meyers: So you're accredited with hundreds of contributions. I'm curious, why did you first get involved in contributing to the platform and how on earth did that spiral into your maintaining 34 modules?
[00:03:12] Luca Lusso: Okay. Um, no, I don't remember exactly what was. My, first contribution, the biggest one is Web Profiler. And I started it because, I also used Symfony for some other projects and when, uh, Drupal switches to Symfony as a core layer. I wonder why we cannot have the same web debugger toolbar as Symfony provides.
[00:03:53] Luca Lusso: Uh, so I, I started, to explore what we have to do in Drupal to have the same feature like in Symfony and probably, at that point I started contributing actively to the Drupal community and then, with other modules like, XHProf or, Monolog or other modules that are unique for the Italian market to do for example, remote authentication with the Italian identity provider.
[00:04:36] Fabian Franz: One question to you. What besides Web Profiler, which probably is your favorite, what is your other favorite Contrib module that you've written?
[00:04:50] **Luca Lusso: **This is an interesting question. Uh, probably Paragraph because I use it a lot to implement front end. It's very interesting module, uh, Devel, that is the module that includes Web Profiler until a couple of months ago. Um, I don't know.
[00:05:24] Michael Meyers: So, Luca, you just mentioned something that's really interesting to me. Web Profiler was historically a part of Devel, which is, you know, pretty much a module that every developer uses. Yes. When building Drupal, it's critical. Moving forward, Web Profiler, spinning out of, Devel, and becoming its own standalone module.
[00:05:46] Michael Meyers: Why is that?
[00:05:48] Luca Lusso: Yes, this is because there's the switch from Symfony 4 to Symfony 6 that Drupal 10, uh, has in core, Web Profiler uses a lot of code, from Symfony because all the, all the stuff that collects information and so on are in Symfony. And between Symfony 4 and Symfony 6 there is a lot of changes in that part of code.
[00:06:18] Luca Lusso: So, Web Profiler cannot use the same code base on Drupal 9 and Drupal 10. Because Symfony is quite different for, for that part. And, uh, the maintainer of, Devel choose to keep compatibility with all Drupal versions. So, uh, Devel is compatible with Drupal 8, Drupal 9, Drupal 10 with the same code base.
[00:06:46] Luca Lusso: So, uh, we have to remove Web Profiler from Devel otherwise You must have to maintain two different versions. One for Drupal 9 and one for Drupal 10.
[00:07:00] Michael Meyers: Are you gonna continue to develop Web Profiler, for Drupal 9 as part of Devel, or is your focus gonna be exclusively on Drupal 10 moving forward?
[00:07:12] Luca Lusso: Okay. For, simplicity, we also remove Web Profiler from Devel [Drupal] nine.
[00:07:18] Luca Lusso: So, the latest version of Devel the number five, does not contain Web Profiler anymore. Also on, Drupal 9. So on the Web Profiler page on Drupal.Org, you can download the Web Profiler for Drupal 9 or for Drupal 10. I will maintain the Drupal 9 version of course, for bug fix and so on, but probably I don't have time to port the new features back to the Drupal 9 version.
[00:07:52] Luca Lusso: So some features will be available only on, um, on Drupal 10.
[00:08:00] Michael Meyers: Before we jump into a demo, you said this was inspired by the Symfony Web Profiler. Does it use some of the same underlying components or is it just inspired by, like, is there any.
[00:08:11] Luca Lusso: Okay. No, it's Web Profiler uses a lot of code.
[00:08:16] Luca Lusso: From the Symfony components that Drupal uses. So, um, for example, all the logic that run the profile store, it run all the data collectors comes directly from the Symfony component, the tire on the core of Drupal. So we don't implement anything. We are using that code. Uh, we are also using some data collectors directly from Symfony because for example routing or request response is exactly the same as in Symfony.
[00:08:52] Luca Lusso: So we are using exactly the same code and we have developed a lot of new data collectors to collect Drupal-specific data like Views or configuration and so on.
[00:09:09] Michael Meyers: Awesome. Do you wanna spin up a demo and, and walk us through some of the features and functionality, what you have planned?
[00:09:17] Luca Lusso: Yes, of course. So let me share this window.
[00:09:26] Michael Meyers: Now, what version of Web Profiler are you showing?
[00:09:29] Luca Lusso: Yes, this is the version for Drupal 10. In this case, we are run on the latest beta of Drupal 10. That is beta two. You can see this, because the new graphic, the old Web Profiler has a white toolbar. At the bottom of the, of the page, because that was the graphics, Symfony 4 uses.
[00:10:00] Luca Lusso: Then in Symfony 5 the Symfony community restyled, the, layout of the toolbar. And now that we are on Symfony 6, we can reuse, um, that graphics and layout. So basically what Web Profiler does is instrument a lot of services in, provided by Drupal core, adding the code to count and store, information. For example, we, um, override, we wrap all the services in Drupal that performs routing or event subscribing asset management and so on, with a code that collect information about what Drupal is doing. And this is done for every page that is rendered at the, uh, that is constructed by, Drupal.
[00:11:10] Luca Lusso: And at the end of the request, we store that profile on the file system. So every, for every page, um, rendered by Drupal, we store the profile in the file system. And then we attach a toolbar at the end of every pages that loads, the started profile to show collected information in this case. If you install Web Profiler on Drupal 10 using Umami profile you can see that at the end of the, at the bottom of the, of the homepage.
[00:11:55] Luca Lusso: We render this, uh, this toolbar and every number, every piece of this toolbar is provided by a data collector that collects information, store it in a profile. And then the toolbar show the values under and under the page. At the moment, we are collecting a set of information.
[00:12:25] Luca Lusso: Um, we can see the complete list of collecting information going to the configuration page of Web Profiler, where we see all the, all the toolbar item. Uh, that represents a data collector. In right now we are collecting all adjuncts requests that the page is done, all assets.
[00:12:53] Luca Lusso: So all CSS and JavaScripts that are injected in a specific page or blocks that are law loaded and rendered in the page, or cache items that is read from the cache all configuration, is used to build that page. Uh, all database queries. The value is just a shortcut to level comments provides by the Devel module.
[00:13:25] Luca Lusso: We collect all the events. Fired in a page and all the event subscribers that response to that event, all the extension enabled, all the form rendered. We collect a lot of data about front end performances. For example, using the timing, navigation, timing api, and in this new version, also collecting Core Web Vitals.
[00:13:55] Luca Lusso: If you're on Chrome, Of course then we collect every http calls made to external services. Every mail sent, how memory is spent across building the page. All information about request and response. So either parameters from the request, from the response and so on. Routing information.
[00:14:23] Luca Lusso: All the services that are used to build a page, state the information retrieved from the state API, information retrieved from the team system. So which team which templates are used, how many time each templates needs to be around at and then the time to build the page like the complete page, all the translation that are using the page, information about the user that is logging in the page, and of course, which views as render logging information.
[00:15:05] Luca Lusso: So for example, if we go to the home page we can see for example, that the route name that matches the url we are seeing the controller class that handle this route the user that is logging in how many time, how many memory, uh, the list of queries executed and so on.
[00:15:35] Luca Lusso: The toolbar is just an overview of data.
[00:15:40] Luca Lusso: All the data are in the, in the dashboard. So when you click on one of these widget on the toolbar, you go on the dashboard version, dashboard part of Web Profiler that is not styled yet. So we are, right now, we are working on the design part of the dashboard is a little bit, uh, scary at the moment but, all the data is there, is not pre printed, basically.
[00:16:14] Luca Lusso: So for example, for the request data collector, we can see again, the name the controller class the controller method and all the information sent to the to the controller. For example the services that control the access to that route, cookies and so on. For example, for the database, we have all the executed queries that are executed to build this page, how many time every query needs to be executed. We can swap a placeholder, we can copy the query to be re-executed, for example, to debug purposes and so on, we can ask MySQL to explain the query to understand if you can improve the performance of that specific query and so on.
[00:17:20] Luca Lusso: We can see all the services loaded or not loaded. For this page, all the assets, so the list of CSS, the list of JavaScript, a list of Drupal settings that are injected in the, in the page. Uh, and so on. For example, one, uh, one useful thing can be,
[00:17:42] Fabian Franz: um, could you, could you show the cache?
[00:17:44] Luca Lusso: Yes, of course. The cache in the cache, uh, tab.
[00:17:50] Luca Lusso: We, we show every bin, every cache bin, and for every cache bin we list all the cache ID that are loaded for this page if this cache load was an hit or a miss, and if that cache is targeted with some cache tag, we also see all the cache tag for for specific cache items.
[00:18:26] Michael Meyers: You mentioned earlier, you showed roughly two dozen of these data collectors, you know, the database, the front end, and you could enable or disable what's shown in the toolbar. Does that also disable what metrics are collected or does it just not show it in the toolbar to save space?
[00:18:43] Luca Lusso: Okay. Now you just disabled the widget on the toolbar.
[00:18:49] Luca Lusso: Data, uh, all the datas are always collected for every page.
[00:18:55] Michael Meyers: Is there any sort of overhead in collecting this data, like a cost observation? You know, you're collecting two dozen data collectors, storing that information to disc. Does that impact the actual performance of the page that you're monitoring, or is it immaterial?
[00:19:13] Luca Lusso: Yeah. Yes, of course. You have a, some sort of, uh, impact on the rendering on the page because this collecting phase, of course, Web Profiler is not to be used on production. Because is at the moment it's just a tool for developing, understanding what your Drupal is doing on local.
[00:19:41] Luca Lusso: Uh, because the effort to mainly to brought all the results on disc is, has an impact. We brought the result on disc. On kernel terminate event. So just after the page start to be sending start, to be delivered to the browser. So at the very end of the response. Uh, but of course, an impact, there is an impact.
[00:20:20] Michael Meyers: So you try and delay and optimize the impact there, there is an impact. Is it material or is it immaterial? Like in other words, does the act of monitoring impact performance to the point where it might slow down a page that you know would otherwise be faster?
[00:20:38] Luca Lusso: No, it's quite noticeable on a local machine. So you can, you can keep Web Profiler on when you develop a website and you don't see any, in any differences.
[00:20:51] Michael Meyers: And is that the recommendation you, you know, when you're developing, you always have the Web Profiler running in the toolbar?
[00:20:58] Luca Lusso: Yes.
[00:20:59] Luca Lusso: Yes, because, I always needed to understand where the controller is or if a database query has been executed with the specific parameters and so on.
[00:21:13] Fabian Franz: So, Yes. Yeah, it's really, it's really awesome. I can, can understand why this module was always used within the Devel model module because there's so much that is, is like, So useful developer information like, Oh, what form is this on, um, where can I find it?
[00:21:37] Fabian Franz: And then you look into the source code of the HTML and you find the form ID and you grab the source code for it. And Web Profiler just makes this so much similar. Probably if I want to find the search form at the top, I would find it in the bottom metrics here somewhere is what I assume?
[00:21:54] Luca Lusso: This, the search form?
[00:21:56] Fabian Franz: Yes.
[00:21:56] Luca Lusso: It's here the search block form. And now I'm sharing just the browser window. But every time a Web Profiler collect a class name with a method name that class name and with method name is a link. To the code in your ID. So for example, I have this project on PHP Storm, and if I click on the class name, here on the toolbar PHP Storm open opens that file at that specific line automatically.
[00:22:40] Luca Lusso: And you can configure also the ID you are using, for example, PHP Storm or text mate is also your code and so on. And if you are running your website in a container or in a virtual machine or in a way that the path of the code on, for example, the docker container is not the same as your local environment.
[00:23:13] Luca Lusso: You can map the remote path with the local path. So Web Profiler wrote the part of every file to be correct on your local.
[00:23:28] Fabian Franz: It's really awesome.
[00:23:33] Fabian Franz: I really love that.
[00:23:35] Michael Meyers: This thing is insane. It logs anything and everything and shows you in a really neatly organized format. What's going on and makes it super easy to dig into it.
[00:23:48] Luca Lusso: Exactly.
[00:23:49] Fabian Franz: Yeah. Uh, one question I had and that is can you have like an option like put profiles or something like that?
[00:24:00] Fabian Franz: Is this per profiles are there profiles like pretty large or are they, is it pretty okay from a standpoint of how much space they use.
[00:24:13] Luca Lusso: The dimension of each profile? It can be huge. It is started in a compressed format, so, it's manageable but, let me check.
[00:24:33] Luca Lusso: Um, for example, right now, a single profile, Okay. On my local installation, for example, a single profile is about. 140 kilobytes.
[00:24:52] Fabian Franz: That's nothing.
[00:24:54] Luca Lusso: I mean it's not so much. But you just keep in mind that every single request store a profile. So if you have a page that calls 10, that performs 10 adjuncts requests, you will have 11 started profile, because one for the main page and one for every request, basically. So, uh, it can be big. You can also choose to purge all the profiles on cache clear if you want. Also you have an option to purge all the profiles directly from the settings page. If you want. The Drupal 9 version of Web Profiler can also store profiles on database if you want.
[00:25:56] Luca Lusso: But, the Symfony web profiler dismiss part. So the Symfony toolbar can store that only on file system and in effect on the we had some issues because the table in the database grows a lot. So we deprecated that that storage. And right now we can only store profiles on the file system.
[00:26:26] Michael Meyers: The irony, the performance profiling tool crashes your website.
[00:26:33] Fabian Franz: Yeah. I mean, it shouldn't be used in production, so hopefully that's not an option, an issue. I can see why. I think the data collectors in a way could still be useful if you needed to do some trace. I mean, what you can do in production is profile every request. That's just way too much data.
[00:26:57] Fabian Franz: Exactly. Um, and also not needed. But what you can do is, you can do like sample profiling, like every thousands request or whatever, depending on how many requests you get, what your hardware's like, or every 10,000 requests. You could create a profile and then just collect the data and then download it somehow and look at some sample traces from your users.
[00:27:20] Fabian Franz: Anything that's pretty cool overall because you have abilities to essentially, um, yeah. I mean it will, we are probably not replace New Relic, but you could even send that data into New Relic or services like that. And just get much more information that way. I'm not sure, have you ever heard of Cache Metrics?
[00:27:43] Fabian Franz: Luca, sorry. Have you ever heard of cache metrics a module, cache_metrics?
[00:27:52] Luca Lusso: No, I don't, No.
[00:27:53] Fabian Franz: It's a module that was written by Moshe Weitzman who is also working for Tag1 right now, okay, he is famously known as the inventor of Drush. And cache_metrics allows you to essentially send cache data, like, cache tag invalidations and how many cache ads, cache misses, etc. You have to New Relic and then you can visualize them there. And, uh, that's pretty cool. Yeah. So I just want for those listening or watching this podcast. Just bring that out because it's it's nice. Because that is something you can use in production end, which is really helpful and has helped us find a lot of performance problems here.
[00:28:38] Fabian Franz: So, and I really love it that you have like those tools that are local and that you use for them further analyzing tools and then you have these other things. But yeah, I love your data collectors and just. The abstractive way you've built it, that you have like this data collection machines and Yeah, as soon as data is collect, you can do with it whatever you want.
[00:29:01] Fabian Franz: Uh, one question I had is if I have like XHProf enabled or things like that, would the trace also show up this in the Web Profiler toolbar? Like do you have some kind of integration there?
[00:29:14] Luca Lusso: Yes. Right now for just for Drupal 9, for the Web Profiler, for Drupal 9. If you enable also XHProf and you can add a new, you can turn on a new data collector that show the information collected by XHProf, you can directly go to the dashboard of XHProf to see the results. For Drupal 10 is not yet available.
[00:29:44] Fabian Franz: Cool. Thanks.
[00:29:44] Michael Meyers: When is the D 10 version gonna come out? What do you need to do to get there? You know, we, you know, you showed some pages that you're still theming, Is it mostly polish or is there features in functionality that you're still working on?
[00:30:00] Luca Lusso: Yes. I hopefully it'll be completed by the release of Drupal 10 in December.
[00:30:07] Luca Lusso: The main missing points are the layout of the dashboard and the log, in the reports page of all collected profiles that is needed because right now you cannot compare two different profiles. So if you want to understand if some change is improving or, or not?
[00:30:42] Luca Lusso: Uh, a webpage, you have to load the page, open the profile, do the change reload the page, open the new profile, and then manually compare. If numbers are better or, what the Web Profiler for Drupal 9 does is adding a page in the reports section of the backend where all the profiles are listed.
[00:31:16] Luca Lusso: So you can reopen a profile you have recorded in the past. So, um, right now the layout of the dashboard and list of collected pages are missing a part. All other, all the stuff that collects information is complete.
[00:31:43] Michael Meyers: You mentioned that there are some new features coming out in the Drupal 10 version, Core Web Vitals being one of them.
[00:31:51] Michael Meyers: That's how we recently met at DrupalCon Prague. We were doing a talk with Google about improving Drupal's Core Web Vitals. For folks out there who aren't familiar with them, you know, really important metrics to help measure the end user experience, the performance of your page, which is directly correlated with things like time on site, sales, revenue, conversions, things of that nature.
[00:32:17] Michael Meyers: Can you show us that feature? Is it in this version yet?
[00:32:22] Luca Lusso: Yes it is in this version, but I have to stop share because I'm sharing Firefox and on Firefox, this feature is not supported because we are using APIs from Google Chrome. So, just a second. I stopped the share here and I shared the same website on Chrome.
[00:32:43] Luca Lusso: This one. Okay, so this is the same website, the same url, the same button. Now we are in Chrome and here in the front end data collector. So the collector that collects information directly in the front end other than information from the Performance timing api. For example, the time to first byte or the time for data download or building of the the tree of the html.
[00:33:16] Luca Lusso: We also have information from Core Web Vitals API, for example, the largest Contentful paint or first input delay, and so on. Some metrics are calculated only when the page is unloaded. So, for example the CLS is not available now because I have to open, for example, a new tab to have the browser calculate it.
[00:33:49] Luca Lusso: Just when the metrics appear I have it in the toolbar and on the dashboard site. Of course, it's not styled yet but, we have all the information required to analyze all metrics, all those metrics. For example, for LCP, we can see that these the image in the background is the one that causes the largest Contentful paint
[00:34:31] Luca Lusso: And so on the first input delay, all the information is stored in the profile. So we can. Do these things here. First of all, draw all the information in a pretty way to be understandable, and then we can use this information to compare to different version of the same page and also to suggest developers what to improve, what to change to improve those metrics.
[00:35:09] Michael Meyers: That's really actionable information. I mean that, I think that's super exciting. Cause you know, there's so much data coming out of this system understanding, you know, which of the 24 collectors and data to look at how is my site performing, not performing a key part of the Core Web Vitals in those three metrics is measuring to standards. And so saying that, if the largest contentful paint is greater than 2.5 seconds that you know is yellow or red, right? That's a problem that you should be aware of. What you're saying is your tool's gonna give you some insight into warning signs. You know, Hey, there's a problem here. You're falling below industry standards that are gonna negatively impact your user experience. Oh, and also click here because here's ways that you can then optimize these different metrics to improve the performance of your site. Like, say, implementing lazy loading, activating lazy loading in Core for specific aspects.
[00:36:14] Luca Lusso: Yes. We can do this also because in the same profile, for example, we have all those data and also the list of enabled extensions. So we can understand. We can suggest to the user which extension to enable or disable, or if you have some database query that is too slow, we can point the user to that query to improve it.
[00:36:45] Luca Lusso: Uh, so having all those data is quite useful to suggest how to improve performance.
[00:36:56] Fabian Franz: I had a question. You have like the rating here, like good rating, but do you also show like the rating on the toolbar or with colors like green
[00:37:05] Luca Lusso: Right now? No. No. It's not shown on the toolbar, but of course we can do that because all those information are collected on the front end so we can print whatever we want here. Also, we don't change the color at the moment of this data collector. If performance is not, uh, good enough, we do for the database, for example. But of course we can change the color. For example, if some Core Vitals is not good.
[00:37:43] Fabian Franz: Yeah, I would love that because that being yellow would immediately alert people, of course, and tell them like, Hey, your image is really screwing up things and maybe optimize it or think of a little bit different way to do things, cetera like that.
[00:38:00] Fabian Franz: So, yeah. That's really cool. I think an invaluable tool in combination of things like Lighthouse, with some more metrics where you can then compare like the real metrics of how I would experience those. But I can also always in Chrome and other browsers just set my connection to be, Hey, and I will have a really slow connection, and now I'm, I'm gonna test the site out and look at how my Core Web Vitals are then and really, really use that part.
[00:38:32] Fabian Franz: Yeah. But yeah, I love your module, Luca, it's really fantastic. Really, really great work and so useful. And I think the only thing I would wish for dashboard, but probably a larger community task is to decide on some kind of graphing library or whatever, and just visually show cache hit rate.
[00:38:56] Fabian Franz: 90% or a hundred percent or more those aggregation things like, way with one glance, the tables and all data is fantastic that we have it. But it would be like, like my vision for the dashboard would be at the top of that, for especially the catching part. You have like, 100% cache hit rate which you usually should have on Drupal or 90% or 0% or whatever there is, and find uncacheable things that are just not cacheable. And um, yeah, I think that these kinda, um, Uh, meter metrics, I would say average is 90 percentile. Is kind of like the next step when you really want to look at those things, especially where you're collecting a lot of data in that.
[00:39:48] Michael Meyers: Yeah, this is really amazing. If you're developing Drupal applications, you need to be using this module. It's, you know, you're failing at your job if you're not. Luca, you know, we gotta wrap up. We're almost outta time, but before we do, so, one quick question. Speaking of features and functionalities and wishlists is there anything that you would love the community to do to help you out as you're racing towards this D 10 release?
[00:40:18] Michael Meyers: Are you looking for contributors?
[00:40:21] Luca Lusso: Yes, of course. Always. A part of the code I need a hand, probably, on the design of the dashboard because I'm not a frontend developer, so, it's not easier for me to brought CSS and so on. Uh, maybe documentation, it can be very useful. Also for providing new data collectors.
[00:40:52] Luca Lusso: Because maybe other module maintainers can brought to data collectors for their specific module that can be useful to expose expose data. Also of, at the moment, the module doesn't have a basically any tests, Uh, so, again, developers that can help me on testing, on broad test for Web Profiler.
[00:41:25] Luca Lusso: And again, every ideas or suggestion, it's welcome. So anybody that can contribute it's very, it can be very helpful.
[00:41:41] Michael Meyers: Definitely. Please download and check out the module and give Luca a hand cause this thing generates so much value. Luca, thank you so much for joining Fabian and I, we really appreciate the walkthrough.
[00:41:54] Michael Meyers: This is, this is really is amazing. To the folks listening and watching, we'll throw some links into the show description notes to Core Vitals to Web Profiler, and Lucas's other modules. If you like this talk, please remember to up upload, subscribe, and share it out. You can check out our past Tag1 Team Talks at tag1.com/ttt.
[00:42:17] Michael Meyers: We'd also love your feedback. Nothing makes me happier to get your emails feedback from the show. You can email us at ttt@tag1.com and again, huge thank you, Luca. This was amazing. And to everyone who tuned in, thank you so much for joining us.
[00:42:41] Luca Lusso: Thank you. Thank you, Michael.