Skip to content

Add metrics for OTA transfers #39991

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

peterv-apple
Copy link
Contributor

@peterv-apple peterv-apple commented Jul 14, 2025

Summary

This adds metrics for OTA BDX transfers, recording vendor id, product id, whether the device is on a Thread network, the offset and number of bytes processed and the duration of the transfer.

Because the metrics infrastructure was only used for commissioning before, I tried adding support for encoding categories in the existing key/value system. I also think we don't have good support for recording metrics during simultaneous transfers to different devices. That would require a bit of a redesign of the metrics system.

Testing

I added a new test that verifies that metrics are recorded. Unfortunately the OTA tests that do an actual transfer are all disabled in automation, because they used to timeout. I did verify locally that the test passes.

Readability checklist

The checklist below will help the reviewer finish PR review in time and keep the
code readable:

  • PR title is
    descriptive
  • Apply the
    “When in Rome…”
    rule (coding style)
  • PR size is short
  • Try to avoid "squashing" and "force-update" in commit history
  • CI time didn't increase

See: Pull Request Guidelines

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces metrics for OTA transfers. It adds a new categorization system for metrics to separate OTA metrics from existing commissioning metrics. The changes include new APIs for metrics collection, logging OTA-related data, and a new test to verify the functionality. The review focuses on a potential breaking API change in the metrics collector, code duplication, and adherence to Objective-C coding idioms.

Copy link

github-actions bot commented Jul 14, 2025

PR #39991: Size comparison from ad2e3f5 to abdc57c

Full report (59 builds for bl602, bl702, bl702l, cc13x4_26x4, cc32xx, efr32, esp32, linux, nrfconnect, nxp, psoc6, qpg, stm32, telink, tizen)
platform target config section ad2e3f5 abdc57c change % change
bl602 lighting-app bl602+mfd+littlefs+rpc FLASH 1102628 1102628 0 0.0
RAM 178970 178970 0 0.0
bl702 lighting-app bl702+eth FLASH 656030 656030 0 0.0
RAM 134929 134929 0 0.0
bl702+wifi FLASH 833218 833218 0 0.0
RAM 124469 124469 0 0.0
bl706+mfd+rpc+littlefs FLASH 1065336 1065336 0 0.0
RAM 117341 117341 0 0.0
bl702l contact-sensor-app bl702l+mfd+littlefs FLASH 894882 894882 0 0.0
RAM 105628 105628 0 0.0
lighting-app bl702l+mfd+littlefs FLASH 978600 978600 0 0.0
RAM 109820 109820 0 0.0
cc13x4_26x4 lighting-app LP_EM_CC1354P10_6 FLASH 763080 763080 0 0.0
RAM 103328 103328 0 0.0
lock-ftd LP_EM_CC1354P10_6 FLASH 774620 774620 0 0.0
RAM 108496 108496 0 0.0
pump-app LP_EM_CC1354P10_6 FLASH 720960 720960 0 0.0
RAM 96900 96900 0 0.0
pump-controller-app LP_EM_CC1354P10_6 FLASH 705252 705252 0 0.0
RAM 97108 97108 0 0.0
cc32xx air-purifier CC3235SF_LAUNCHXL FLASH 548818 548818 0 0.0
RAM 205104 205104 0 0.0
lock CC3235SF_LAUNCHXL FLASH 581794 581794 0 0.0
RAM 205304 205304 0 0.0
efr32 lock-app BRD4187C FLASH 954984 954984 0 0.0
RAM 126532 126532 0 0.0
BRD4338a FLASH 749388 749380 -8 -0.0
RAM 251880 251880 0 0.0
window-app BRD4187C FLASH 1049512 1049512 0 0.0
RAM 122728 122728 0 0.0
esp32 all-clusters-app c3devkit DRAM 102232 102232 0 0.0
FLASH 1780566 1780566 0 0.0
IRAM 83862 83862 0 0.0
m5stack DRAM 121116 121116 0 0.0
FLASH 1747870 1747870 0 0.0
IRAM 117071 117071 0 0.0
linux air-purifier-app debug unknown 4856 4856 0 0.0
FLASH 2796466 2796466 0 0.0
RAM 117288 117288 0 0.0
all-clusters-app debug unknown 5672 5672 0 0.0
FLASH 6198506 6198506 0 0.0
RAM 532112 532112 0 0.0
all-clusters-minimal-app debug unknown 5536 5536 0 0.0
FLASH 5473410 5473410 0 0.0
RAM 227944 227944 0 0.0
bridge-app debug unknown 5568 5568 0 0.0
FLASH 4807622 4807622 0 0.0
RAM 207648 207648 0 0.0
camera-app debug unknown 8976 8976 0 0.0
FLASH 6948347 6948347 0 0.0
RAM 230688 230688 0 0.0
camera-controller debug unknown 9216 9216 0 0.0
FLASH 14389035 14389035 0 0.0
RAM 662488 662488 0 0.0
chip-tool debug unknown 6272 6272 0 0.0
FLASH 14763345 14763345 0 0.0
RAM 656192 656192 0 0.0
chip-tool-ipv6only arm64 unknown 40736 40736 0 0.0
FLASH 12733255 12733255 0 0.0
RAM 702440 702440 0 0.0
closure-app debug unknown 5536 5536 0 0.0
FLASH 4790478 4790478 0 0.0
RAM 200520 200520 0 0.0
fabric-admin debug unknown 5952 5952 0 0.0
FLASH 12806165 12806165 0 0.0
RAM 655224 655224 0 0.0
fabric-bridge-app debug unknown 4816 4816 0 0.0
FLASH 4592952 4592952 0 0.0
RAM 193360 193360 0 0.0
fabric-sync debug unknown 5056 5056 0 0.0
FLASH 5741517 5741517 0 0.0
RAM 492624 492624 0 0.0
lighting-app debug+rpc+ui unknown 6280 6280 0 0.0
FLASH 5694417 5694417 0 0.0
RAM 209912 209912 0 0.0
lock-app debug unknown 5488 5488 0 0.0
FLASH 4836334 4836334 0 0.0
RAM 197128 197128 0 0.0
ota-provider-app debug unknown 4856 4856 0 0.0
FLASH 4446808 4446808 0 0.0
RAM 186048 186048 0 0.0
ota-requestor-app debug unknown 4736 4736 0 0.0
FLASH 4518930 4518930 0 0.0
RAM 188920 188920 0 0.0
shell debug unknown 4288 4288 0 0.0
FLASH 3076412 3076412 0 0.0
RAM 147280 147280 0 0.0
thermostat-no-ble arm64 unknown 9832 9832 0 0.0
FLASH 4236063 4236063 0 0.0
RAM 233272 233272 0 0.0
tv-app debug unknown 5824 5824 0 0.0
FLASH 6106541 6106541 0 0.0
RAM 616904 616904 0 0.0
tv-casting-app debug unknown 5352 5352 0 0.0
FLASH 12907581 12907581 0 0.0
RAM 772624 772624 0 0.0
nrfconnect all-clusters-app nrf52840dk_nrf52840 FLASH 888064 888064 0 0.0
RAM 166122 166122 0 0.0
nrf7002dk_nrf5340_cpuapp FLASH 897204 897204 0 0.0
RAM 145060 145060 0 0.0
all-clusters-minimal-app nrf52840dk_nrf52840 FLASH 858388 858388 0 0.0
RAM 141014 141014 0 0.0
nxp contact mcxw71+release FLASH 624744 624744 0 0.0
RAM 63132 63132 0 0.0
lock mcxw71+release FLASH 775952 775952 0 0.0
RAM 67788 67788 0 0.0
psoc6 all-clusters cy8ckit_062s2_43012 FLASH 1632452 1632452 0 0.0
RAM 211064 211064 0 0.0
all-clusters-minimal cy8ckit_062s2_43012 FLASH 1576644 1576644 0 0.0
RAM 208432 208432 0 0.0
light cy8ckit_062s2_43012 FLASH 1449436 1449436 0 0.0
RAM 197152 197152 0 0.0
lock cy8ckit_062s2_43012 FLASH 1481692 1481692 0 0.0
RAM 224872 224872 0 0.0
qpg lighting-app qpg6200+debug FLASH 744184 744184 0 0.0
RAM 94252 94252 0 0.0
lock-app qpg6200+debug FLASH 753804 753804 0 0.0
RAM 94280 94280 0 0.0
stm32 light STM32WB5MM-DK FLASH 465236 465236 0 0.0
RAM 141336 141336 0 0.0
telink bridge-app tl7218x FLASH 702278 702278 0 0.0
RAM 93564 93564 0 0.0
light-app-ota-compress-lzma-shell-factory-data tl3218x FLASH 794006 794006 0 0.0
RAM 43980 43980 0 0.0
light-app-ota-shell-factory-data tl7218x FLASH 782412 782412 0 0.0
RAM 100876 100876 0 0.0
light-switch-app-ota-compress-lzma-factory-data tl7218x_retention FLASH 709528 709528 0 0.0
RAM 54204 54204 0 0.0
light-switch-app-ota-compress-lzma-shell-factory-data tlsr9528a FLASH 746122 746122 0 0.0
RAM 77368 77368 0 0.0
light-switch-app-ota-factory-data tl3218x_retention FLASH 722848 722848 0 0.0
RAM 36960 36960 0 0.0
lighting-app-ota-factory-data tlsr9118bdk40d FLASH 602948 602948 0 0.0
RAM 112496 112496 0 0.0
lighting-app-ota-rpc-factory-data-4mb tlsr9518adk80d FLASH 817966 817970 4 0.0
RAM 99128 99128 0 0.0
tizen all-clusters-app arm unknown 5096 5096 0 0.0
FLASH 1695632 1695632 0 0.0
RAM 91404 91404 0 0.0
chip-tool-ubsan arm unknown 20800 20800 0 0.0
FLASH 21098370 21098370 0 0.0
RAM 9178412 9178412 0 0.0

@@ -477,6 +480,8 @@ MTR_EXTERN NSString * const MTRDataVersionKey MTR_AVAILABLE(ios(17.6), macos(14.
*/
- (void)deviceConfigurationChanged:(MTRDevice *)device MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6));

- (void)otaTransferEnded:(MTRDevice *)device metrics:(MTRMetrics *)metrics;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Though I wonder whether we should communicate the metrics to the actual "transfer ended" callback... but that might be hard due to the API changes needed, I guess.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure which callback you're talking about here.

Copy link
Contributor

@woody-apple woody-apple left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving pending resolved comments (internal headers)

Comment on lines 110 to 113
constexpr Tracing::MetricKey kMetricOTADeviceVendorID = NOT_COMMISSIONING_METRICS_KEY(ota, device_vendor_id);

// Device Product ID
constexpr Tracing::MetricKey kMetricOTADeviceProductID = NOT_COMMISSIONING_METRICS_KEY(ota, device_product_id);
Copy link
Contributor

@anush-apple anush-apple Jul 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a thought: Is there a better way to have product and vendor ID that is the same key for all categories ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issue is the filtering, we could special-case vendor and product id and never filter them?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But even with filtering the issue is that if we have values for different categories that use the same key, then we might be deleting those for all categories as soon as we submit one of the categories.

woody-apple and others added 2 commits July 18, 2025 09:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Todo
Development

Successfully merging this pull request may close these issues.

4 participants