Skip to content

[FR] Allow custom attributes on built-in traces via global attribute API#8031

Closed
jrodiz wants to merge 4 commits into
firebase:mainfrom
jrodiz:feature/jrc-6664.Support.custom.attributes.in.fireperf
Closed

[FR] Allow custom attributes on built-in traces via global attribute API#8031
jrodiz wants to merge 4 commits into
firebase:mainfrom
jrodiz:feature/jrc-6664.Support.custom.attributes.in.fireperf

Conversation

@jrodiz
Copy link
Copy Markdown
Contributor

@jrodiz jrodiz commented Apr 10, 2026

[FR] Allow custom attributes on built-in traces (#6664)

Summary

Resolves #6664

FirebasePerformance already had putAttribute/removeAttribute/getAttribute/getAttributes backed by a ConcurrentHashMap, and TransportManager already attached those global attributes to every logged event — but the four methods were @hide, so developers could not actually set them.

This PR removes the @hide annotations, makes the related constants public, and adds the methods to the public API surface. No behavioral change is needed in the trace/network serialization pathTransportManager.setApplicationInfoAndBuild (firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java:507-512) already calls putAllCustomAttributes(getGlobalCustomAttributes()) on ApplicationInfo for every trace metric and network request metric.

Where the attributes land

Global attributes attach at the ApplicationInfo.custom_attributes level, not at TraceMetric.custom_attributes / NetworkRequestMetric.custom_attributes. That distinction matters for any consumer reading the proto directly — those are separate proto fields. Trace- and request-level attributes set via Trace.putAttribute / HttpMetric.putAttribute continue to land in their respective per-event custom_attributes map and are independent of the global ones.

Usage

// In Application.onCreate() — set once, applies to all built-in and custom traces
// and to all network requests
FirebasePerformance.getInstance().putAttribute("build_type", "debug");
FirebasePerformance.getInstance().putAttribute("user_tier", "premium");

These attributes will appear on _app_start, _app_in_foreground, _app_in_background, screen traces (_st_*), network requests, and all custom traces automatically — via the existing TransportManager logic.

Notes

  • Attribute limit: the global pool is validated at MAX_TRACE_CUSTOM_ATTRIBUTES (5) by FirebasePerformance.putAttribute's existing checkAttribute() call.
  • Thread safety: mCustomAttributes is a ConcurrentHashMap; getAttributes() returns a defensive copy.
  • Timing for _app_start: global attributes must be set before the trace is built (e.g., in Application.onCreate()).
  • Backward compatible: all four methods already existed; only visibility was changed.

Verification

./gradlew :firebase-perf:test

All tests pass locally.

Resolves firebase#6664.

FirebasePerformance already had putAttribute/getAttribute/removeAttribute/
getAttributes backed by a ConcurrentHashMap, but they were @hide and not
wired into built-in trace serialization. This change makes them public and
ensures global attributes are included on all traces (built-in and custom).

Changes:
- Make global attribute methods (putAttribute, removeAttribute, getAttribute,
  getAttributes) public on FirebasePerformance
- Expose MAX_TRACE_CUSTOM_ATTRIBUTES, MAX_ATTRIBUTE_KEY_LENGTH,
  MAX_ATTRIBUTE_VALUE_LENGTH as public constants on FirebasePerformance
- Update api.txt with the expanded public API surface
- Merge global attributes in TraceMetricBuilder (screen + custom Trace objects)
- Add global attributes to AppStartTrace (_app_start)
- Add global attributes to AppStateMonitor.sendSessionLog() (_fs, _bs)
- Merge global attributes in NetworkRequestMetricBuilder (auto + manual HTTP)
- Trace/request-level attributes take precedence over global on key conflicts

Test coverage (TraceMetric.custom_attributes):
- AppStartTraceTest: global attrs on _app_start
- AppStateMonitorTest: global attrs on _app_in_foreground, _app_in_background,
  and screen traces (_st_*)
- TraceMetricBuilderTest: global attrs merged, trace-level overrides global
- NetworkRequestMetricBuilderTest: global attrs on network requests,
  per-request overrides global
- TransportManagerTest: global attrs on built-in traces at ApplicationInfo level
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

@mrober mrober requested review from mrober and tejasd April 16, 2026 19:14
… full attribute scope

Global attributes apply to all traces (built-in and custom) via TraceMetricBuilder,
not only the built-in traces listed in the original changelog entry. Updated the
entry to accurately describe the full scope and mention that the attribute methods
and constants were made public.
@jrodiz
Copy link
Copy Markdown
Contributor Author

jrodiz commented May 11, 2026

/gemini review

Copy link
Copy Markdown
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 makes global attribute methods and constants public in FirebasePerformance and ensures these attributes are merged into all traces (built-in and custom) and network requests. Feedback suggests enforcing the MAX_TRACE_CUSTOM_ATTRIBUTES limit during the merge process to prevent events from being dropped by the backend and optimizing map allocations by utilizing the defensive copy returned by getAttributes().

jrodiz added 2 commits May 14, 2026 00:17
TransportManager.setApplicationInfoAndBuild already adds global custom
attributes to all traces and network requests at the ApplicationInfo level
(TransportManager.java:507-512). The merging logic added in this PR to
TraceMetricBuilder, NetworkRequestMetricBuilder, AppStartTrace, and
AppStateMonitor duplicated those attributes at the TraceMetric /
NetworkRequestMetric level, which is redundant.

Visibility changes on FirebasePerformance, api.txt, and CHANGELOG are
preserved — exposing the previously @hide global-attribute APIs is all
that this PR needs to do.
@@ -1,5 +1,6 @@
# Unreleased

- [feature] Made the global attribute methods (`putAttribute`, `removeAttribute`, `getAttribute`, `getAttributes`) and related constants (`MAX_TRACE_CUSTOM_ATTRIBUTES`, `MAX_ATTRIBUTE_KEY_LENGTH`, `MAX_ATTRIBUTE_VALUE_LENGTH`) public on `FirebasePerformance`. Global attributes set via these methods are attached to all traces — built-in (`_app_start`, `_app_in_foreground`, `_app_in_background`, screen traces) and custom — as well as all network requests. [#6664]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

"Global attributes set via these methods are attached to all traces — automatic (for eg. _app_start, screen traces and network traces) and manual."

@jrodiz jrodiz closed this May 14, 2026
@jrodiz
Copy link
Copy Markdown
Contributor Author

jrodiz commented May 14, 2026

Closing fork PR in favor of: #8162

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FR]: Performance: Allow adding custom attributes to built-in traces

2 participants