UseCounter can measure the usage of HTML, CSS, and JavaScript (etc) features across all channels and platforms in the wild. Feature usage is recorded per page load and is anonymously aggregated. Note, measurements are only recorded for HTTP/HTTPS pages. Usage on the new tab page, on data URLs or file URLs are not. Usages in extensions is measured on a separate histogram.
UseCounter data can be biased against scenarios where user metrics analysis is not enabled (e.g., enterprises). However, UseCounter data is essential for understanding adoption of new and existing features, web compat decision making and the blink process for breaking changes, as it reflects the real Chrome usage with a wide fraction of coverage. The results are publicly available on https://chromestatus.com/ and internally (for Google employees) on UMA dashboard and UKM dashboard with more detailed break-downs.
UseCounter measures feature usage via UMA histogram and UKM. To add your feature to UseCounter, simply:
blink::UseCounter::CountWebDXFeature()
or blink::UseCounter::Count()
for blink side features; Orcontent::ContentBrowserClient::LogWeb[DX]FeatureForCurrentPage()
for browser side features.update_use_counter_feature_enum.py
] to update the UMA mappings.Example:
enum WebDXFeature { ... kMyFeature = N, ... }
interface MyInterface { ... [MeasureAs="WebDXFeature::kMyFeature"] myIdlAttribute; ... }
OR
enum WebFeature { ... kMyFeature = N, ... }
interface MyInterface { ... [MeasureAs=MyFeature] myIdlAttribute; ... }
OR
MyInterface::MyBlinkSideFunction() { ... UseCounter::CountWebDXFeature(context, WebDXFeature::kMyFeature); ... }
OR
MyInterface::MyBlinkSideFunction() { ... UseCounter::Count(context, WebFeature::kMyFeature); ... }
OR
MyBrowserSideFunction() { ... GetContentClient()->browser()->LogWeb[DX]FeatureForCurrentPage( render_frame_host, blink::mojom::Web[DX]Feature::kMyFeature); ... }
All WebDXFeature use counters automatically get URL-keyed metrics collected for them. But WebFeature and other types of counters do not collect URL-keyed metrics by default. To opt your non-WebDXFeature feature use counter in to UKM metrics collection, add your feature to UseCounterPageLoadMetricsObserver::GetAllowedUkmFeatures() and get approval from the privacy/metrics owners.
You can quickly verify that your feature is added to UMA histograms and UKM by checking chrome://histograms/Blink.UseCounter.WebDXFeatures, chrome://histograms/Blink.UseCounter.Features and chrome://ukm in your local build.
To add a test for a use counter, there are several options:
For use counters recorded from the renderer, internal WPTs expose the internals.isUseCounted
and internals.clearUseCounter
functions for testing use counters recorded for a given document.
Chrome browser tests can verify that use counters were recorded by using a base::HistogramTester
to check whether the “Blink.UseCounter.Features” histogram was emitted to for the bucket corresponding to the new WebFeature. If the use counter is recorded from the renderer, content::FetchHistogramsFromChildProcesses()
can be used to make this use counter activity visible to the browser process.
For use counters recorded from the browser process (e.g. by calling GetContentClient()->browser()->LogWebFeatureForCurrentPage()
), a content browser test can be used by creating a subclass of ContentBrowserTestContentBrowserClient
that implements LogWebFeatureForCurrentPage
, creating an instance of it in SetUpOnMainThread
, and checking whether the instance's LogWebFeatureForCurrentPage
is called. One way to implement this is to have LogWebFeatureForCurrentPage
be defined as a MOCK_METHOD
and then use EXPECT_CALL
to ensure that the method is called as expected with the new WebFeature value. Note that the ContentBrowserTestContentBrowserClient
instance should be destroyed in TearDownOnMainThread
.
Usage of JavaScript and HTML features is publicly available here. Usage of CSS properties is publicly available here.
The data reflects features' daily usage (count of feature hits / count of total page visits):
See (https://goto.google.com/uma-usecounter) for internal tooling.
Some metrics of interest:
HTTP Archive crawls the top 10K sites on the web and records everything from request and response headers. The data is available on Google BigQuery.
You can find pages that trigger a particular UseCounter using the following script:
SELECT DATE(yyyymmdd) AS date, client AS platform, num_url AS url_count, pct_urls AS urls_percentile, sample_urls AS url FROM [httparchive:blink_features.usage] WHERE feature = 'MyFeature' ORDER BY url_percentile DESC
OR
SELECT url FROM [httparchive:pages.yyyy_mm_dd_mobile] WHERE JSON_EXTRACT(payload, '$._blinkFeatureFirstUsed.Features.MyFeature') IS NOT NULL LIMIT 500
You can also find pages that trigger a particular CSS property (during parsing):
SELECT url FROM [httparchive:pages.yyyy_mm_dd_mobile] WHERE JSON_EXTRACT(payload, '$._blinkFeatureFirstUsed.CSSFeatures.MyCSSProperty') IS NOT NULL LIMIT 500
To find pages that trigger a UseCounter and sort by page rank:
SELECT IFNULL(runs.rank, 1000000) AS rank, har.url AS url, FROM [httparchive:latest.pages_desktop] AS har LEFT JOIN [httparchive:runs.latest_pages] AS runs ON har.url = runs.url WHERE JSON_EXTRACT(payload, '$._blinkFeatureFirstUsed.Features.MyFeature') IS NOT NULL ORDER BY rank;
You may also see the fraction of users that trigger your feature at lease once a day on UMA Usage dashboard.
For privacy concerns, UKM data is available for Google employees only. Please see this internal documentation for details.