Skip to content

pkg/dyninst/decode: Implement decoding of template messages - #42158

Closed
grantseltzer wants to merge 0 commit into
grantseltzer/ir-for-templatesfrom
grantseltzer/template-creation-v2
Closed

pkg/dyninst/decode: Implement decoding of template messages#42158
grantseltzer wants to merge 0 commit into
grantseltzer/ir-for-templatesfrom
grantseltzer/template-creation-v2

Conversation

@grantseltzer

@grantseltzer grantseltzer commented Oct 20, 2025

Copy link
Copy Markdown
Member

What does this PR do?

Adds support for decoding template messages captured via dynamic instrumentation.

Motivation

Allowing users to specify templates in Go DI/LD using the expression language. For now just variable referencing would be supported.

Describe how you validated your changes

Integration and unit tests.

Additional Notes

@grantseltzer
grantseltzer requested a review from a team as a code owner October 20, 2025 19:08
@grantseltzer grantseltzer added changelog/no-changelog No changelog entry needed [deprecated] team/dynamic-instrumentation Dynamic Instrumentation qa/done QA done before merge and regressions are covered by tests labels Oct 20, 2025
@github-actions github-actions Bot added the long review PR is complex, plan time to review it label Oct 20, 2025
@grantseltzer
grantseltzer marked this pull request as draft October 20, 2025 19:09
@grantseltzer
grantseltzer marked this pull request as ready for review October 20, 2025 19:15
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from 46873ad to f992905 Compare October 20, 2025 19:21
@agent-platform-auto-pr

agent-platform-auto-pr Bot commented Oct 20, 2025

Copy link
Copy Markdown
Contributor

Go Package Import Differences

Baseline: 6feee7a
Comparison: b3a9d45

binaryosarchchange
system-probelinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/pkg/dyninst/exprlang
system-probelinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/pkg/dyninst/exprlang

@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from f992905 to 256a689 Compare October 20, 2025 19:48

@ajwerner ajwerner left a comment

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.

Flushing what I had typed, we discussed some of this offline.

Comment thread pkg/dyninst/ir/probe_kind_string.go Outdated
@@ -1,5 +1,7 @@
// Code generated by "stringer -type=ProbeKind -linecomment -output probe_kind_string.go"; DO NOT EDIT.

//go:build linux_bpf

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.

did you just manually add this line? that's not really reasonable because it means that when other folks re-run go generate it'll go away. One thing you can do is write a shell script that go generate invokes that will both run stringer and then modify the files to add the relevant tags.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Yes - I added it to one file and was just following the IDE telling me to do so, I missed that they were generated. I can write a script in another PR if needed but it doesn't seem to be causing any issues to not have this build tag here. I've just removed the change for now.

Comment thread pkg/dyninst/ir/program.go Outdated
// StringSegment is a string literal in the template
type StringSegment struct {
Value string
Index int

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.

index into what? I remain skeptical of the value of this field (commented on that previously).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Removed.

Comment thread pkg/dyninst/ir/program.go Outdated
@@ -144,15 +147,50 @@ type Variable struct {
// PCRange is the range of PC values that will be probed.
type PCRange = [2]uint64

// Template represents the concrete template structure for a probe

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.

nit: periods on sentences to match the style in the rest of the file

Comment thread pkg/dyninst/ir/program.go Outdated
Comment on lines +177 to +178
// RootTypeExpressionIndicies is a map of type IDs to the indices of the root expressions that correspond to this segment.
RootTypeExpressionIndicies map[TypeID]int

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.

As I said last time around, I don't understand why this is a map.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

As discussed IRL, we now have an EventKind and EventExpressionIndex. This aligns the segment with an expression within an event.

Comment thread pkg/dyninst/ir/program.go Outdated
Comment on lines +179 to +180
// ExpressionKind is the kind of expression that corresponds to this segment.
ExpressionKind EventKind

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.

nit: this field should be called EventKind or trigger event or something -- it's not really the kind of the expression and it's not using the type RootExpressionKind.

This is really about which event this expression value should be taken from, right?

Comment thread pkg/dyninst/irgen/irgen.go Outdated
Comment on lines +1829 to +1832
return ir.Issue{
Kind: ir.IssueKindUnsupportedFeature,
Message: "only 'ref' operation supported in templates",
}

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.

We may want to know more about what's going on here. What if you switched on the type and for unsupported told us the operation?

Comment thread pkg/dyninst/irgen/irgen.go Outdated
// Check if we already have an expression for this variable
if existingIdx, ok := variableExpressionSet[targetVar.Name]; ok {
// Reuse existing expression index
jsonSeg.RootTypeExpressionIndicies[id] = existingIdx

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.

I don't understand why this is keyed on id

Comment thread pkg/dyninst/irgen/irgen.go Outdated
expressions = append(expressions, expr)
}

// Process template segments if template exists
var variableExpressionSet map[string]int

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.

what is this?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

It maps expression names to their index within the event. It enables us to not create duplicate expressions when processing template segments.

@agent-platform-auto-pr

agent-platform-auto-pr Bot commented Oct 20, 2025

Copy link
Copy Markdown
Contributor

Static quality checks

✅ Please find below the results from static quality gates
Comparison made with ancestor 6feee7a

Successful checks

Info

Quality gate Delta On disk size (MiB) Delta On wire size (MiB)
agent_deb_amd64 $${+0.04}$$ $${677.11}$$ < $${702.15}$$ $${+0.06}$$ $${165.3}$$ < $${177.79}$$
agent_deb_amd64_fips $${+0.04}$$ $${671.62}$$ < $${696.65}$$ $${-0.05}$$ $${164.25}$$ < $${176.53}$$
agent_heroku_amd64 $${0}$$ $${336.53}$$ < $${340.18}$$ $${-0}$$ $${89.81}$$ < $${91.08}$$
agent_msi $${0}$$ $${1013.4}$$ < $${1015.38}$$ $${+0.01}$$ $${148.21}$$ < $${150.78}$$
agent_rpm_amd64 $${+0.04}$$ $${677.1}$$ < $${702.14}$$ $${+0.04}$$ $${167.46}$$ < $${180.53}$$
agent_rpm_amd64_fips $${+0.04}$$ $${671.61}$$ < $${696.64}$$ $${-0.01}$$ $${166.08}$$ < $${178.79}$$
agent_rpm_arm64 $${+0.04}$$ $${667.11}$$ < $${686.31}$$ $${+0.03}$$ $${153.45}$$ < $${161.22}$$
agent_rpm_arm64_fips $${+0.04}$$ $${662.64}$$ < $${681.84}$$ $${-0.02}$$ $${152.55}$$ < $${160.18}$$
agent_suse_amd64 $${+0.04}$$ $${677.1}$$ < $${702.14}$$ $${+0.04}$$ $${167.46}$$ < $${180.53}$$
agent_suse_amd64_fips $${+0.04}$$ $${671.61}$$ < $${696.64}$$ $${-0.01}$$ $${166.08}$$ < $${178.79}$$
agent_suse_arm64 $${+0.04}$$ $${667.11}$$ < $${686.31}$$ $${+0.03}$$ $${153.45}$$ < $${161.22}$$
agent_suse_arm64_fips $${+0.04}$$ $${662.64}$$ < $${681.84}$$ $${-0.02}$$ $${152.55}$$ < $${160.18}$$
docker_agent_amd64 $${+0.04}$$ $${747.66}$$ < $${773.59}$$ $${+0.02}$$ $${252.1}$$ < $${266.06}$$
docker_agent_arm64 $${+0.04}$$ $${761.62}$$ < $${781.7}$$ $${+0.02}$$ $${242.69}$$ < $${251.85}$$
docker_agent_jmx_amd64 $${+0.04}$$ $${938.53}$$ < $${964.45}$$ $${+0.02}$$ $${320.74}$$ < $${334.68}$$
docker_agent_jmx_arm64 $${+0.04}$$ $${941.08}$$ < $${961.17}$$ $${+0.02}$$ $${307.31}$$ < $${316.44}$$
docker_cluster_agent_amd64 $${-0}$$ $${213.35}$$ < $${213.74}$$ $${+0}$$ $${72.41}$$ < $${73.14}$$
docker_cluster_agent_arm64 $${+0}$$ $${229.24}$$ < $${229.68}$$ $${+0}$$ $${68.67}$$ < $${69.41}$$
docker_cws_instrumentation_amd64 $${-0}$$ $${7.07}$$ < $${7.12}$$ $${-0}$$ $${2.95}$$ < $${3.29}$$
docker_cws_instrumentation_arm64 $${0}$$ $${6.69}$$ < $${6.92}$$ $${+0}$$ $${2.7}$$ < $${3.07}$$
docker_dogstatsd_amd64 $${0}$$ $${38.44}$$ < $${39.3}$$ $${+0}$$ $${14.84}$$ < $${15.76}$$
docker_dogstatsd_arm64 $${0}$$ $${37.12}$$ < $${37.94}$$ $${-0}$$ $${14.28}$$ < $${14.83}$$
dogstatsd_deb_amd64 $${0}$$ $${29.66}$$ < $${30.53}$$ $${+0}$$ $${7.82}$$ < $${8.75}$$
dogstatsd_deb_arm64 $${0}$$ $${28.25}$$ < $${29.11}$$ $${+0}$$ $${6.77}$$ < $${7.71}$$
dogstatsd_rpm_amd64 $${0}$$ $${29.66}$$ < $${30.53}$$ $${-0}$$ $${7.83}$$ < $${8.76}$$
dogstatsd_suse_amd64 $${0}$$ $${29.66}$$ < $${30.53}$$ $${-0}$$ $${7.83}$$ < $${8.76}$$
iot_agent_deb_amd64 $${0}$$ $${42.32}$$ < $${54.97}$$ $${+0}$$ $${11.05}$$ < $${14.45}$$
iot_agent_deb_arm64 $${0}$$ $${40.11}$$ < $${51.9}$$ $${+0}$$ $${9.53}$$ < $${12.63}$$
iot_agent_deb_armhf $${0}$$ $${40.03}$$ < $${51.84}$$ $${+0}$$ $${9.64}$$ < $${12.74}$$
iot_agent_rpm_amd64 $${0}$$ $${42.32}$$ < $${54.97}$$ $${-0}$$ $${11.06}$$ < $${14.47}$$
iot_agent_suse_amd64 $${0}$$ $${42.32}$$ < $${54.97}$$ $${-0}$$ $${11.06}$$ < $${14.47}$$

@cit-pr-commenter

cit-pr-commenter Bot commented Oct 20, 2025

Copy link
Copy Markdown

Regression Detector

Regression Detector Results

Metrics dashboard
Target profiles
Run ID: b22df35a-6bfd-4370-8ea5-ced6c0d5a4ca

Baseline: 6feee7a
Comparison: b3a9d45
Diff

Optimization Goals: ✅ No significant changes detected

Experiments ignored for regressions

Regressions in experiments with settings containing erratic: true are ignored.

perf experiment goal Δ mean % Δ mean % CI trials links
docker_containers_cpu % cpu utilization -12.10 [-13.66, -10.54] 1 Logs

Fine details of change detection per experiment

perf experiment goal Δ mean % Δ mean % CI trials links
docker_containers_memory memory utilization +2.52 [+2.17, +2.86] 1 Logs
quality_gate_metrics_logs memory utilization +0.71 [+0.52, +0.91] 1 Logs bounds checks dashboard
quality_gate_idle_all_features memory utilization +0.47 [+0.42, +0.51] 1 Logs bounds checks dashboard
otlp_ingest_metrics memory utilization +0.31 [+0.19, +0.43] 1 Logs
ddot_logs memory utilization +0.31 [+0.24, +0.37] 1 Logs
otlp_ingest_logs memory utilization +0.20 [+0.07, +0.33] 1 Logs
file_to_blackhole_100ms_latency egress throughput +0.03 [-0.57, +0.63] 1 Logs
file_to_blackhole_1000ms_latency egress throughput +0.01 [-0.60, +0.62] 1 Logs
tcp_dd_logs_filter_exclude ingress throughput -0.00 [-0.01, +0.01] 1 Logs
file_tree memory utilization -0.00 [-0.06, +0.06] 1 Logs
file_to_blackhole_0ms_latency egress throughput -0.01 [-0.61, +0.59] 1 Logs
uds_dogstatsd_to_api ingress throughput -0.03 [-0.27, +0.20] 1 Logs
file_to_blackhole_500ms_latency egress throughput -0.09 [-0.69, +0.51] 1 Logs
quality_gate_idle memory utilization -0.13 [-0.16, -0.09] 1 Logs bounds checks dashboard
quality_gate_logs % cpu utilization -0.23 [-3.03, +2.56] 1 Logs bounds checks dashboard
ddot_metrics_sum_cumulative memory utilization -0.26 [-0.38, -0.14] 1 Logs
ddot_metrics_sum_cumulativetodelta_exporter memory utilization -0.35 [-0.56, -0.14] 1 Logs
ddot_metrics_sum_delta memory utilization -0.36 [-0.52, -0.20] 1 Logs
ddot_metrics memory utilization -0.49 [-0.65, -0.32] 1 Logs
uds_dogstatsd_20mb_12k_contexts_20_senders memory utilization -0.59 [-0.66, -0.52] 1 Logs
tcp_syslog_to_blackhole ingress throughput -0.81 [-0.88, -0.73] 1 Logs
docker_containers_cpu % cpu utilization -12.10 [-13.66, -10.54] 1 Logs

Bounds Checks: ❌ Failed

perf experiment bounds_check_name replicates_passed links
docker_containers_cpu simple_check_run 10/10
docker_containers_memory memory_usage 9/10
docker_containers_memory simple_check_run 10/10
file_to_blackhole_0ms_latency lost_bytes 10/10
file_to_blackhole_0ms_latency memory_usage 10/10
file_to_blackhole_1000ms_latency memory_usage 10/10
file_to_blackhole_100ms_latency lost_bytes 10/10
file_to_blackhole_100ms_latency memory_usage 10/10
file_to_blackhole_500ms_latency lost_bytes 10/10
file_to_blackhole_500ms_latency memory_usage 10/10
quality_gate_idle intake_connections 10/10 bounds checks dashboard
quality_gate_idle memory_usage 10/10 bounds checks dashboard
quality_gate_idle_all_features intake_connections 10/10 bounds checks dashboard
quality_gate_idle_all_features memory_usage 10/10 bounds checks dashboard
quality_gate_logs intake_connections 10/10 bounds checks dashboard
quality_gate_logs lost_bytes 10/10 bounds checks dashboard
quality_gate_logs memory_usage 10/10 bounds checks dashboard
quality_gate_metrics_logs cpu_usage 10/10 bounds checks dashboard
quality_gate_metrics_logs intake_connections 10/10 bounds checks dashboard
quality_gate_metrics_logs lost_bytes 10/10 bounds checks dashboard
quality_gate_metrics_logs memory_usage 10/10 bounds checks dashboard

Explanation

Confidence level: 90.00%
Effect size tolerance: |Δ mean %| ≥ 5.00%

Performance changes are noted in the perf column of each table:

  • ✅ = significantly better comparison variant performance
  • ❌ = significantly worse comparison variant performance
  • ➖ = no significant change in performance

A regression test is an A/B test of target performance in a repeatable rig, where "performance" is measured as "comparison variant minus baseline variant" for an optimization goal (e.g., ingress throughput). Due to intrinsic variability in measuring that goal, we can only estimate its mean value for each experiment; we report uncertainty in that value as a 90.00% confidence interval denoted "Δ mean % CI".

For each experiment, we decide whether a change in performance is a "regression" -- a change worth investigating further -- if all of the following criteria are true:

  1. Its estimated |Δ mean %| ≥ 5.00%, indicating the change is big enough to merit a closer look.

  2. Its 90.00% confidence interval "Δ mean % CI" does not contain zero, indicating that if our statistical model is accurate, there is at least a 90.00% chance there is a difference in performance between baseline and comparison variants.

  3. Its configuration does not mark it "erratic".

CI Pass/Fail Decision

Passed. All Quality Gates passed.

  • quality_gate_logs, bounds check intake_connections: 10/10 replicas passed. Gate passed.
  • quality_gate_logs, bounds check memory_usage: 10/10 replicas passed. Gate passed.
  • quality_gate_logs, bounds check lost_bytes: 10/10 replicas passed. Gate passed.
  • quality_gate_metrics_logs, bounds check memory_usage: 10/10 replicas passed. Gate passed.
  • quality_gate_metrics_logs, bounds check intake_connections: 10/10 replicas passed. Gate passed.
  • quality_gate_metrics_logs, bounds check cpu_usage: 10/10 replicas passed. Gate passed.
  • quality_gate_metrics_logs, bounds check lost_bytes: 10/10 replicas passed. Gate passed.
  • quality_gate_idle_all_features, bounds check memory_usage: 10/10 replicas passed. Gate passed.
  • quality_gate_idle_all_features, bounds check intake_connections: 10/10 replicas passed. Gate passed.
  • quality_gate_idle, bounds check memory_usage: 10/10 replicas passed. Gate passed.
  • quality_gate_idle, bounds check intake_connections: 10/10 replicas passed. Gate passed.

@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch 3 times, most recently from cb47269 to 60598ae Compare October 21, 2025 20:33

@grantseltzer grantseltzer left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

.

type SegmentList []TemplateSegment

// UnmarshalJSON implements custom JSON unmarshaling for SegmentList
func (sl *SegmentList) UnmarshalJSON(data []byte) error {

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Transposing you comment here:

Rather than enforcing this structure at the point of unmarshaling, I think it'd be better to do it at the point of validation / in the call to GetSegments(). Concretely: consider either keeping []json.RawMessage. Alternatively, what if we just at this layer define a struct that has all three fields and then in validate we assert that only the correct subset are populated? I feel like that's pretty clean and quite efficient. Then when we iterate we can just cast to the proper implementation pointer for the corresponding subset of fields.

I see the advantage of your suggestion as having a concrete type here, as all the other fields of LogProbeCommon are. However I still like having an interface here. As Piotr described when he gave his opinion, it's more idiomatic to type switch rather than treat fields of a struct like a union. Are there any performance benefits to your suggestion?

Comment thread pkg/dyninst/ir/program.go Outdated
Comment on lines +177 to +178
// RootTypeExpressionIndicies is a map of type IDs to the indices of the root expressions that correspond to this segment.
RootTypeExpressionIndicies map[TypeID]int

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

As discussed IRL, we now have an EventKind and EventExpressionIndex. This aligns the segment with an expression within an event.

Comment thread pkg/dyninst/ir/program.go Outdated
// StringSegment is a string literal in the template
type StringSegment struct {
Value string
Index int

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Removed.

Comment thread pkg/dyninst/ir/probe_kind_string.go Outdated
@@ -1,5 +1,7 @@
// Code generated by "stringer -type=ProbeKind -linecomment -output probe_kind_string.go"; DO NOT EDIT.

//go:build linux_bpf

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Yes - I added it to one file and was just following the IDE telling me to do so, I missed that they were generated. I can write a script in another PR if needed but it doesn't seem to be causing any issues to not have this build tag here. I've just removed the change for now.

Comment thread pkg/dyninst/irgen/irgen.go Outdated
expressions = append(expressions, expr)
}

// Process template segments if template exists
var variableExpressionSet map[string]int

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

It maps expression names to their index within the event. It enables us to not create duplicate expressions when processing template segments.

@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch 2 times, most recently from 104c079 to e181496 Compare October 21, 2025 23:22
@grantseltzer
grantseltzer changed the base branch from main to grantseltzer/ir-for-templates October 22, 2025 02:02
@grantseltzer grantseltzer changed the title pkg/dyninst: Implement basic templates pkg/dyninst/decode: Implement decoding of template messages Oct 22, 2025
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch from e677d67 to e4fb95b Compare October 22, 2025 02:24
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from e181496 to da24bf5 Compare October 22, 2025 02:47
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch from e4fb95b to 0028212 Compare October 22, 2025 02:51
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from da24bf5 to c367e5a Compare October 22, 2025 02:51
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch 2 times, most recently from d8ab7f5 to 8c35978 Compare October 22, 2025 13:05
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from c367e5a to 3fd66e0 Compare October 22, 2025 13:05
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch from 8c35978 to 707d545 Compare October 22, 2025 13:21
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from 3fd66e0 to 3f26031 Compare October 22, 2025 13:22
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch 2 times, most recently from a3b1aaa to 35209f7 Compare October 24, 2025 14:53
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from ff99133 to 2ac4f4e Compare October 24, 2025 14:53
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch 4 times, most recently from 9142e6f to 4ee43e6 Compare October 24, 2025 17:16
@grantseltzer
grantseltzer force-pushed the grantseltzer/template-creation-v2 branch from 2ac4f4e to b3a9d45 Compare October 24, 2025 17:17
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch 13 times, most recently from b9035d1 to 7c6b8d6 Compare October 31, 2025 15:03
@grantseltzer
grantseltzer force-pushed the grantseltzer/ir-for-templates branch 9 times, most recently from 14a653a to 9b59a27 Compare November 4, 2025 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/no-changelog No changelog entry needed [deprecated] team/dynamic-instrumentation Dynamic Instrumentation long review PR is complex, plan time to review it qa/done QA done before merge and regressions are covered by tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants