To check if Google is ignoring your canonicals and serving canonical child URLs, follow these steps:
Crawl your website using a crawler like Screaming Frog that outputs URL, canonical status, and canonical path.
Export your crawl and upload it to a Google Sheet. Name the tab 'Canonicalised URLs'.
Create another tab in the same sheet called 'GSC Click Data'.
Export the last 16 months of search console data. This can be done in the same sheet by clicking 'EXTENSIONS > ADD ONS > GET ADD ONS', then search for and install 'Search analytics for sheets'.
Run 'Search Analytics for Sheets' from 'EXTENSIONS'.
Find your URL under 'verified site'.
Select 'GROUP BY:', choose 'PAGE' and click 'REQUEST DATA'. Adjust the number of 'ROWS' returned if your site has more than 25k URLs.
Name the tab where data is dumped as 'GSC CLICK DATA'.
In your 'Canonicalised URLs' sheet, insert columns in 'COLUMN B / C' and title them 'GSC Clicks' and 'GSC Impressions'.
Paste
=IFERROR(VLOOKUP(A2,'GSC Click Data'!$A$1:$ZZ$999999,2,FALSE),"-")
in cell B2.Paste
=IFERROR(VLOOKUP(A2,'GSC Click Data'!$A$1:$ZZ$999999,3,FALSE),"-")
in cell C2.Cascade the formulas down the entire columns B / C.
Freeze ROW 1 by clicking 'VIEW > FREEZE > 1 ROW'.
Create a filter in ROW 1 by clicking 'DATA > CREATE A FILTER'.
Apply a filter on cell C1 by selecting 'FILTER BY CONDITION', choosing 'greater than', entering '0', and clicking 'OK'.
Now, you have canonicalised URLs with GSC data. These URLs are crucial to rule out cannibalisation and ensure the canonical parent is the lead URL. In most cases, serving canonical child URLs is not desirable. If the data is based on the last 16 months, it might be a legacy issue. You can repeat the process but change the timeframe on the 'Search analytics for sheets' export to the last 3 months.