Skip to content

Conversation

@jbachorik
Copy link
Collaborator

@jbachorik jbachorik commented Jan 7, 2026

What does this PR do?:
Adds remote symbolication support to the Java profiler, enabling native frames to be symbolicated remotely by backend services instead of locally by the agent.

Motivation:

  • Reduce agent overhead by deferring symbol resolution to backend services
  • Support stripped binaries and scenarios where debug symbols aren't available locally
  • Enable centralized symbol management and caching
  • Improve scalability for distributed profiling

How it works:
When remote symbolication is enabled (remotesym=true), the profiler stores build-ID and PC offset information for native frames instead of resolving symbols locally. This raw addressing information is serialized into JFR format and sent to backend services for symbol resolution.

Key Components:

  1. Build-ID Extraction (symbols_linux_dd.h/cpp)

    • Extracts GNU build-id from ELF binaries on Linux
    • O(1) caching via _build_id_processed set to prevent redundant extraction
    • Validates ELF structure with bounds and alignment checks
  2. Packed Frame Data (profiler.h/cpp, vmEntry.h)

    • 64-bit jmethodID encoding: pc_offset (44 bits) | mark (3 bits) | lib_index (17 bits)
    • RemoteFramePacker utility for packing/unpacking
    • Zero memory overhead - data packed directly into existing jmethodID field
    • Signal-handler safe (no allocations in hot paths)
  3. Stack Walker Integration (stackWalker_dd.h, gradle/patching.gradle)

    • Integrated at native frame resolution point in all stack walking modes
    • walkFP/walkDwarf: convertNativeTrace()populateRemoteFrame()
    • walkVM/walkVMX: resolveNativeFrameForWalkVM() called during stack walk
    • Dynamic BCI selection (BCI_NATIVE_FRAME vs BCI_NATIVE_FRAME_REMOTE)
  4. JFR Serialization (flightRecorder.cpp/h)

    • Unpacks remote frame data during serialization
    • Class name: build-id hex string
    • Method name: <remote> marker
    • Signature: PC offset as hex (0x<offset>)
    • Frame type: FRAME_NATIVE_REMOTE (7)
  5. Library Management (libraries.h/cpp, codeCache.h/cpp)

    • Automatic build-ID extraction on profiler start
    • Build-ID storage in CodeCache (one-time per library)
    • Library index lookup for JFR unpacking (getLibraryByIndex)

Configuration:

# Enable remote symbolication
java -agentpath:libjavaProfiler.so=start,cpu,remotesym=true,file=profile.jfr MyApp

Observability:
Three new counters track feature usage:

  • REMOTE_SYMBOLICATION_FRAMES: Frames using remote symbolication
  • REMOTE_SYMBOLICATION_LIBS_WITH_BUILD_ID: Libraries with extracted build-IDs
  • REMOTE_SYMBOLICATION_BUILD_ID_CACHE_HITS: Build-ID cache efficiency

Thread Safety:

  • Build-ID extraction: Protected by _build_id_lock mutex
  • Build-ID cache: Lock-free O(1) duplicate detection
  • JFR serialization: Library array stable during lockAll() hold

Performance:

  • Identical hot-path performance to traditional symbolication
  • Same O(log n) binarySearch for mark checking
  • Zero allocation overhead in signal handlers
  • Reduced memory: 8 bytes per frame vs full symbol strings

Platform Support:

  • Linux: Full support with ELF build-id extraction
  • macOS/Windows: Framework ready, needs platform-specific extraction

Testing:

./gradlew testDebug
./gradlew :ddprof-lib:gtest:gtestDebug
./gradlew :ddprof-test:test --tests RemoteSymbolicationTest

Test Coverage:

  • C++ unit tests: remotesymbolication_ut.cpp, remoteargs_ut.cpp
  • Integration tests: RemoteSymbolicationTest.java (all cstack modes: vm, vmx, fp, dwarf)
  • Native test library: libddproftest.so with guaranteed build-id

Documentation:

Backward Compatibility:

  • Default behavior unchanged (remote symbolication disabled by default)
  • Graceful fallback to local symbolication when build-ID unavailable
  • Mixed traces support both local and remote frames

For Datadog employees:

  • If this PR touches code that signs or publishes builds or packages, or handles
    credentials of any kind, I've requested a review from @DataDog/security-design-and-guidance.
  • This PR doesn't touch any of that.
  • JIRA: PROF-12279

@jbachorik jbachorik added the AI label Jan 7, 2026
@jbachorik jbachorik force-pushed the air/enable-remote-symbolication-for-java-profiler-d872d3bd-2 branch 3 times, most recently from b41a6eb to 74c5410 Compare January 7, 2026 13:20
@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 wall]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes wall wall
wall on on

Summary

Found 0 performance improvements and 1 performance regressions! Performance is the same for 14 metrics, 23 unstable metrics.

scenario Δ mean execution_time Δ mean rss
scenario:renaissance:akka-uct worse
[+0.409s; +1.843s] or [+1.503%; +6.771%]
unstable
[-196.393MB; +377.081MB] or [-16.197%; +31.098%]

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 cpu,wall,alloc,memleak]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc on on
cpu on on
iterations 5 5
java "11.0.28" "11.0.28"
memleak on on
modes cpu,wall,alloc,memleak cpu,wall,alloc,memleak
wall on on

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 15 metrics, 23 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 memleak,alloc]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc on on
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak on on
modes memleak,alloc memleak,alloc
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 16 metrics, 22 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 alloc]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc on on
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes alloc alloc
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 14 metrics, 24 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 memleak]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak on on
modes memleak memleak
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 15 metrics, 23 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 cpu]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu on on
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes cpu cpu
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 15 metrics, 23 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [x86_64 cpu,wall]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu on on
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes cpu,wall cpu,wall
wall on on

Summary

Found 1 performance improvements and 0 performance regressions! Performance is the same for 14 metrics, 23 unstable metrics.

scenario Δ mean execution_time Δ mean rss
scenario:renaissance:chi-square better
[-1.721s; -0.315s] or [-10.078%; -1.843%]
unstable
[-361.052MB; +460.826MB] or [-32.822%; +41.893%]

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 cpu]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu on on
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes cpu cpu
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 16 metrics, 22 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 memleak,alloc]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc on on
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak on on
modes memleak,alloc memleak,alloc
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 17 metrics, 21 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 alloc]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc on on
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes alloc alloc
wall off off

Summary

Found 1 performance improvements and 0 performance regressions! Performance is the same for 15 metrics, 22 unstable metrics.

scenario Δ mean execution_time Δ mean rss
scenario:renaissance:scala-doku better
[-3.250s; -0.606s] or [-10.669%; -1.990%]
unstable
[-196.742MB; +269.241MB] or [-18.418%; +25.205%]

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 wall]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes wall wall
wall on on

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 17 metrics, 21 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 cpu,wall]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu on on
iterations 5 5
java "11.0.28" "11.0.28"
memleak off off
modes cpu,wall cpu,wall
wall on on

Summary

Found 2 performance improvements and 0 performance regressions! Performance is the same for 15 metrics, 21 unstable metrics.

scenario Δ mean execution_time Δ mean rss
scenario:renaissance:scala-doku better
[-3.195s; -0.585s] or [-10.497%; -1.924%]
unstable
[-196.499MB; +269.992MB] or [-18.381%; +25.256%]
scenario:renaissance:par-mnemonics better
[-2.971s; -0.813s] or [-12.277%; -3.359%]
unstable
[-251.815MB; +344.276MB] or [-24.226%; +33.122%]

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 cpu,wall,alloc,memleak]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc on on
cpu on on
iterations 5 5
java "11.0.28" "11.0.28"
memleak on on
modes cpu,wall,alloc,memleak cpu,wall,alloc,memleak
wall on on

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 16 metrics, 22 unstable metrics.

@pr-commenter
Copy link

pr-commenter bot commented Jan 7, 2026

Benchmarks [aarch64 memleak]

Parameters

Baseline Candidate
config baseline candidate
ddprof 1.34.4 1.35.0-air_enable-remote-symbolication-for-java-profiler-d872d3bd-2-SNAPSHOT
See matching parameters
Baseline Candidate
alloc off off
cpu off off
iterations 5 5
java "11.0.28" "11.0.28"
memleak on on
modes memleak memleak
wall off off

Summary

Found 0 performance improvements and 0 performance regressions! Performance is the same for 17 metrics, 21 unstable metrics.

@jbachorik jbachorik force-pushed the air/enable-remote-symbolication-for-java-profiler-d872d3bd-2 branch 3 times, most recently from 1788096 to 55578ac Compare January 9, 2026 11:57
@jbachorik jbachorik requested a review from Copilot January 9, 2026 20:08

This comment was marked as outdated.

This comment was marked as outdated.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

jbachorik and others added 7 commits January 16, 2026 13:53
Consolidates all documentation under the doc/ directory instead of
having a separate docs/ directory. This matches the existing pattern
where documentation files are in doc/.

- Renamed docs/architecture/CallTraceStorage.md to doc/architecture/CallTraceStorage.md
- Renamed docs/architecture/TLSContext.md to doc/architecture/TLSContext.md
- Renamed docs/architecture/TlsPriming.md to doc/architecture/TlsPriming.md
- Removed empty docs/ directory

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Updated references in ddprof-stresstest/README.md to point to the
new doc/architecture/ location instead of doc/ directly.

- Changed doc/CallTraceStorage.md to doc/architecture/CallTraceStorage.md

This completes the consolidation of all documentation under the doc/
directory with proper subdirectory organization.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Rename all documentation files under doc/ to use consistent PascalCase
naming convention for improved consistency across the codebase.

Changes:
- event-type-system.md → EventTypeSystem.md
- MODIFIER_ALLOCATION.md → ModifierAllocation.md
- profiler-memory-requirements.md → ProfilerMemoryRequirements.md
- REMOTE_SYMBOLICATION.md → RemoteSymbolication.md

Update references:
- README.md: Update link to RemoteSymbolication.md

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Update remotesym argument parsing to match the robust pattern used
by other BOOL flags (like mcleanup):

- Explicitly handle false values: 'n', 'no', 'f', 'false', '0'
- Explicitly handle true values: 'y', 'yes', 't', 'true', '1'
- Handle no-value case: 'remotesym' alone enables the feature
- Any other value defaults to enabled (consistent with mcleanup)

This prevents accepting invalid values like "remotesym=yikes" and
makes the behavior consistent with other boolean flags in the codebase.

Added comprehensive test coverage:
- Test no-value case (should enable)
- Test numeric values (0 and 1)
- Test "no" and "n" variants (should disable)
- Test invalid values (document default behavior)

Addresses review comments:
- #324 (comment)
- #324 (comment)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Address security and robustness issues in ELF build-ID extraction:

1. Integer overflow vulnerability (symbols_linux_dd.cpp)
   - Replace addition-based bounds check with subtraction pattern
   - Prevents integer wrapping with malicious n_namesz/n_descsz values
   - Progressive checks: header size, name size, desc size independently
   - Uses safe pattern: remaining = note_size - offset - sizeof(header)
   - Each component verified against remaining before subtraction

2. Test race condition (remotesymbolication_ut.cpp)
   - Replace fixed path "/tmp/not_an_elf" with mkstemp()
   - Use unique temporary file: "/tmp/not_an_elf_XXXXXX"
   - Eliminates race conditions in concurrent test environments
   - Avoids conflicts when tests run in parallel
   - Follows best practices for temporary file creation

Addresses review comments:
- #324 (comment)
- #324 (comment)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use portable PRIxPTR macro instead of %lx for formatting uintptr_t
values to ensure correct behavior across all platforms.

Changes:
- Added #include <inttypes.h> for PRIxPTR macro
- Changed format string from "0x%lx" to "0x%" PRIxPTR
- Ensures correct formatting on Windows x64 where uintptr_t is
  unsigned long long, not unsigned long
- Maintains compatibility across all platforms (Linux, macOS, Windows)

The %lx format specifier assumes uintptr_t == unsigned long, which
is not portable. On Windows x64, uintptr_t is unsigned long long,
which would cause format string warnings or incorrect output.

Addresses review comment:
- #324 (comment)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Root Cause Analysis:
OpenJ9 uses JVMTI-based CPU profiling when shouldUseAsgct() returns false,
falling back to the j9_engine (profiler.cpp:1148-1157). JVMTI's
GetAllStackTracesExtended() API only captures Java stack frames and does
not include native frames from dynamically loaded libraries.

Test Requirement:
RemoteSymbolicationTest requires native frames from libddproftest.so to
validate remote symbolication. The test calls RemoteSymHelper.burnCpu()
and computeFibonacci() which invoke native methods, expecting these frames
to appear in samples with build-ID and PC offset information.

Observed Failure:
Test consistently failed after 10 retry attempts with:
- 48-52 samples collected per attempt
- 0 frames from libddproftest found
- Log shows: [TEST::INFO] J9[cpu]=jvmti
- Library loaded successfully with valid build-ID

This is a fundamental limitation of JVMTI-based profiling on OpenJ9, not
a bug in remote symbolication. The feature works correctly on HotSpot JVMs
which use signal-based profiling (perf_events/itimer) that captures both
Java and native frames.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@jbachorik jbachorik marked this pull request as ready for review January 16, 2026 16:44
@jbachorik jbachorik requested a review from a team January 16, 2026 16:46
jbachorik and others added 2 commits January 16, 2026 16:49
- flightRecorder.cpp: Fix incorrect "2025, 2026" to "2026"
- arguments.cpp: Add Datadog copyright for modifications

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…dd.cpp

Added detailed comments with links to official specifications:
- ELF Specification from Linux Foundation
- LSB ELF Note Section format
- GNU build-id feature documentation
- GNU binutils ld --build-id option
- readelf(1) manual page

Also added inline documentation of ELF note structure (Elf64_Nhdr) with
field-by-field explanation and 4-byte alignment requirements per spec.

This makes it easier for future developers to understand the build-id
extraction implementation and verify correctness against specifications.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Copy link
Contributor

@rkennke rkennke left a comment

Choose a reason for hiding this comment

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

Nice work! Looks mostly good, except I have question in one place.

strcpy(_build_id, other._build_id);
}
} else {
_build_id = nullptr;
Copy link
Contributor

Choose a reason for hiding this comment

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

That assignment is redundant, b/c build_id is initialized with nullptr. You could save the whole else-branch.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yeah. This is definitely not needed.


_plt_offset = other._plt_offset;
_plt_size = other._plt_size;
_debug_symbols = other._debug_symbols;
Copy link
Contributor

Choose a reason for hiding this comment

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

Is this the exact same code block as a few lines above? If so, it would be better to extract this into a helper method to avoid duplication.

}
}

void CodeCache::setBuildId(const char* build_id, size_t build_id_len) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Somehow I have the feeling here comes the same sequence of code, yet again (3rd time). Can this be unified (maybe the other 2 instances can be made to call this method)?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Created a shared function to copy the relevant parts.

jbachorik and others added 2 commits January 19, 2026 16:19
Remote symbolication was calling NativeFunc::mark() on RemoteFrameInfo*
pointers, causing garbage memory reads. Added patch to check frame_bci
type before calling mark(), ensuring it's only called on BCI_NATIVE_FRAME.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@jbachorik
Copy link
Collaborator Author

/merge -m squash

@gh-worker-devflow-routing-ef8351
Copy link

gh-worker-devflow-routing-ef8351 bot commented Jan 19, 2026

View all feedbacks in Devflow UI.

2026-01-19 15:48:39 UTC ℹ️ Start processing command /merge -m squash


2026-01-19 15:48:47 UTC ℹ️ MergeQueue: waiting for PR to be ready

This pull request is not mergeable according to GitHub. Common reasons include pending required checks, missing approvals, or merge conflicts — but it could also be blocked by other repository rules or settings.
It will be added to the queue as soon as checks pass and/or get approvals. View in MergeQueue UI.
Note: if you pushed new commits since the last approval, you may need additional approval.
You can remove it from the waiting list with /remove command.


2026-01-19 15:57:52 UTC ℹ️ MergeQueue: merge request added to the queue

The expected merge time in main is approximately 13m (p90).


2026-01-19 16:15:44 UTC ⚠️ MergeQueue: This merge request build was cancelled

jaroslav.bachorik@datadoghq.com cancelled this merge request build

Copy link
Contributor

@rkennke rkennke left a comment

Choose a reason for hiding this comment

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

Ok, much better. We need to coordinate on the patching stuff because of #333.

],

// Stack walker patches for ASan compatibility
// Stack walker patches for ASan compatibility and remote symbolication
Copy link
Contributor

Choose a reason for hiding this comment

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

Given that I'm currently working on removing the patching stuff (#333 ), we need to be careful to avoid a mess here.

@jbachorik
Copy link
Collaborator Author

/remove

@gh-worker-devflow-routing-ef8351
Copy link

gh-worker-devflow-routing-ef8351 bot commented Jan 19, 2026

View all feedbacks in Devflow UI.

2026-01-19 16:15:36 UTC ℹ️ Start processing command /remove


2026-01-19 16:15:40 UTC ℹ️ Devflow: /remove

@jbachorik jbachorik merged commit f8f356c into main Jan 19, 2026
99 of 100 checks passed
@jbachorik jbachorik deleted the air/enable-remote-symbolication-for-java-profiler-d872d3bd-2 branch January 19, 2026 16:15
@github-actions github-actions bot added this to the 1.37.0 milestone Jan 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants