Skip to content

Conversation

@VianneyRuhlmann
Copy link
Contributor

@VianneyRuhlmann VianneyRuhlmann commented Apr 4, 2025

TLDR

This PR adds a new Writer which uses the trace exporter from libdatadog to send traces to the agent.

Description

  • Add PyO3 bindings to expose the rust TraceExporter to python
  • Add a new NativeWriter using the bindings
  • Add a config option to toggle between the AgentWriter and the NativeWriter
  • Update tests accessing private methods/attributes of the writer to support both implementations
  • Register fork hooks for the writer required as the trace exporter rely on a multi-threaded runtime

Motivation

This PR will allow dogfooding of the Trace Exporter in dd-trace-py

Testing

The full test suite has been run on with NativeWriter enable by default, when it is disabled only writer tests and integration tests are run on the NativeWriter.

Checklist

  • PR author has checked that all the criteria below are met
  • The PR description includes an overview of the change
  • The PR description articulates the motivation for the change
  • The change includes tests OR the PR description describes a testing strategy
  • The PR description notes risks associated with the change, if any
  • Newly-added code is easy to change
  • The change follows the library release note guidelines
  • The change includes or references documentation updates if necessary
  • Backport labels are set (if applicable)

Reviewer Checklist

  • Reviewer has checked that all the criteria below are met
  • Title is accurate
  • All changes are related to the pull request's stated goal
  • Avoids breaking API changes
  • Testing strategy adequately addresses listed risks
  • Newly-added code is easy to change
  • Release note makes sense to a user of the library
  • If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment
  • Backport labels are set in a manner that is consistent with the release branch maintenance policy

@VianneyRuhlmann VianneyRuhlmann force-pushed the vianney/add-native-writer branch from f6a7894 to 6da28c4 Compare April 23, 2025 12:26
@VianneyRuhlmann VianneyRuhlmann force-pushed the vianney/add-native-writer branch from 23e676c to c369549 Compare April 30, 2025 15:32
@VianneyRuhlmann VianneyRuhlmann changed the title Add Native Writer feat(writer): [APMSP-1875] implement native writer May 12, 2025
@VianneyRuhlmann VianneyRuhlmann force-pushed the vianney/add-native-writer branch from 086ed3d to 62bf790 Compare May 28, 2025 12:28
@github-actions
Copy link
Contributor

github-actions bot commented May 28, 2025

CODEOWNERS have been resolved as:

.riot/requirements/1550212.txt                                          @DataDog/apm-python
src/native/data_pipeline/exceptions.rs                                  @DataDog/apm-core-python
src/native/data_pipeline/mod.rs                                         @DataDog/apm-core-python
.gitlab/benchmarks/bp-runner.microbenchmarks.fail-on-breach.yml         @DataDog/python-guild @DataDog/apm-core-python
ddtrace/_trace/processor/__init__.py                                    @DataDog/apm-sdk-api-python
ddtrace/_trace/tracer.py                                                @DataDog/apm-sdk-api-python
ddtrace/internal/native/__init__.py                                     @DataDog/apm-core-python
ddtrace/internal/native/_native.pyi                                     @DataDog/apm-core-python
ddtrace/internal/writer/__init__.py                                     @DataDog/apm-core-python
ddtrace/internal/writer/writer.py                                       @DataDog/apm-core-python
ddtrace/settings/_config.py                                             @DataDog/apm-core-python
riotfile.py                                                             @DataDog/apm-python
src/native/Cargo.lock                                                   @DataDog/apm-core-python
src/native/Cargo.toml                                                   @DataDog/apm-core-python
src/native/lib.rs                                                       @DataDog/apm-core-python
tests/contrib/kafka/test_kafka.py                                       @DataDog/apm-core-python @DataDog/apm-idm-python
tests/integration/test_debug.py                                         @DataDog/apm-core-python
tests/integration/test_integration.py                                   @DataDog/apm-core-python
tests/integration/test_integration_snapshots.py                         @DataDog/apm-core-python
tests/integration/test_priority_sampling.py                             @DataDog/apm-sdk-api-python
tests/integration/test_trace_stats.py                                   @DataDog/apm-core-python
tests/integration/utils.py                                              @DataDog/apm-core-python
tests/suitespec.yml                                                     @DataDog/python-guild @DataDog/apm-core-python
tests/telemetry/test_writer.py                                          @DataDog/apm-python
tests/tracer/test_processors.py                                         @DataDog/apm-sdk-api-python
tests/tracer/test_writer.py                                             @DataDog/apm-sdk-api-python
tests/utils.py                                                          @DataDog/python-guild

@github-actions
Copy link
Contributor

github-actions bot commented Jun 3, 2025

Circular import analysis

🚨 New circular imports detected 🚨

The following circular imports among modules have been detected on this PR, when compared to the base branch:

ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.appsec._listeners -> ddtrace.appsec._common_module_patches -> ddtrace.contrib.internal.subprocess.patch -> ddtrace._trace.pin -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._publishers -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.filters -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.processor.endpoint_call_counter -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.schema.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.peer_service.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.trace
ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig.client -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.trace
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.appsec._iast.processor -> ddtrace._trace.processor -> ddtrace.internal.writer.writer -> ddtrace.appsec._remoteconfiguration -> ddtrace.internal.remoteconfig.worker -> ddtrace.internal.remoteconfig._pubsub -> ddtrace.internal.remoteconfig._subscribers -> ddtrace

Please consider refactoring your changes in accordance to the Separation of Concerns principle.

@VianneyRuhlmann VianneyRuhlmann force-pushed the vianney/add-native-writer branch from 2ac64de to 089e2d3 Compare June 11, 2025 09:30
@github-actions
Copy link
Contributor

github-actions bot commented Jun 11, 2025

Bootstrap import analysis

Comparison of import times between this PR and base.

Summary

The average import time from this PR is: 267 ± 6 ms.

The average import time from base is: 267 ± 5 ms.

The import time difference between this PR and base is: -0.4 ± 0.2 ms.

The difference is not statistically significant (z = -1.92).

Import time breakdown

The following import paths have grown:

ddtrace.auto 1.078 ms (0.40%)
ddtrace 1.078 ms (0.40%)
ddtrace.trace 0.620 ms (0.23%)
ddtrace._trace.filters 0.503 ms (0.19%)
ddtrace._trace.processor 0.503 ms (0.19%)
ddtrace.internal.writer 0.399 ms (0.15%)
ddtrace.internal.writer.writer 0.399 ms (0.15%)
ddtrace.settings.asm 0.107 ms (0.04%)
ddtrace.internal.dogstatsd 0.101 ms (0.04%)
ddtrace.vendor.dogstatsd 0.101 ms (0.04%)
ddtrace.vendor.dogstatsd.base 0.101 ms (0.04%)
queue 0.101 ms (0.04%)
heapq 0.101 ms (0.04%)
ddtrace._logger 0.458 ms (0.17%)
ddtrace.internal.telemetry 0.458 ms (0.17%)
ddtrace.internal.telemetry.writer 0.306 ms (0.11%)
http.client 0.306 ms (0.11%)
ssl 0.306 ms (0.11%)
ddtrace.settings._agent 0.152 ms (0.06%)
ddtrace.settings._core 0.152 ms (0.06%)
ddtrace.internal.native 0.152 ms (0.06%)
ddtrace.internal.native._native 0.152 ms (0.06%)

The following import paths have shrunk:

ddtrace.auto 2.538 ms (0.95%)
ddtrace.bootstrap.sitecustomize 1.304 ms (0.49%)
ddtrace.bootstrap.preload 1.200 ms (0.45%)
ddtrace.internal.remoteconfig.client 0.618 ms (0.23%)
ddtrace.bootstrap 0.104 ms (0.04%)
ddtrace 1.234 ms (0.46%)
ddtrace.trace 0.302 ms (0.11%)
ddtrace._trace.filters 0.198 ms (0.07%)
ddtrace._trace.processor 0.198 ms (0.07%)
ddtrace.internal.writer 0.198 ms (0.07%)
ddtrace.internal.writer.writer 0.198 ms (0.07%)
ddtrace.settings.asm 0.106 ms (0.04%)
ddtrace.appsec._constants 0.106 ms (0.04%)
ddtrace.internal.dogstatsd 0.092 ms (0.03%)
ddtrace.vendor.dogstatsd 0.092 ms (0.03%)
ddtrace.vendor.dogstatsd.base 0.092 ms (0.03%)
queue 0.092 ms (0.03%)
heapq 0.092 ms (0.03%)
_heapq 0.092 ms (0.03%)
ddtrace._trace.pin 0.104 ms (0.04%)
ddtrace._logger 0.263 ms (0.10%)
ddtrace.internal.telemetry 0.263 ms (0.10%)
ddtrace.internal.telemetry.writer 0.263 ms (0.10%)
http.client 0.263 ms (0.10%)
ssl 0.263 ms (0.10%)
_ssl 0.263 ms (0.10%)
ddtrace.internal._unpatched 0.027 ms (0.01%)
json 0.027 ms (0.01%)
json.decoder 0.027 ms (0.01%)
re 0.027 ms (0.01%)
enum 0.027 ms (0.01%)
types 0.027 ms (0.01%)

@VianneyRuhlmann VianneyRuhlmann marked this pull request as ready for review June 13, 2025 11:44
@VianneyRuhlmann VianneyRuhlmann requested review from a team as code owners June 13, 2025 11:44
@VianneyRuhlmann VianneyRuhlmann marked this pull request as draft June 13, 2025 11:45
@VianneyRuhlmann VianneyRuhlmann self-assigned this Jun 13, 2025
@VianneyRuhlmann VianneyRuhlmann force-pushed the vianney/add-native-writer branch 2 times, most recently from dcfcc90 to 486beb8 Compare July 1, 2025 12:03
@brettlangdon brettlangdon changed the title feat(writer): [APMSP-1875] implement native writer chore(writer): implement native writer Jul 1, 2025
@brettlangdon brettlangdon added the changelog/no-changelog A changelog entry is not required for this PR. label Jul 1, 2025
@VianneyRuhlmann VianneyRuhlmann force-pushed the vianney/add-native-writer branch from c569fb4 to c816826 Compare August 6, 2025 13:36
@VianneyRuhlmann VianneyRuhlmann changed the title chore(writer): implement native writer APMSP-1875 feat(writer): implement native writer Aug 6, 2025
@VianneyRuhlmann VianneyRuhlmann changed the title APMSP-1875 feat(writer): implement native writer feat(writer): implement native writer [APMSP-1875] Aug 6, 2025
Copy link
Contributor

@wconti27 wconti27 left a comment

Choose a reason for hiding this comment

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

Changes are okay for apm-idm-python files 👍

@brettlangdon brettlangdon enabled auto-merge (squash) August 8, 2025 15:06
@brettlangdon brettlangdon merged commit 100d8cc into main Aug 8, 2025
969 of 1018 checks passed
@brettlangdon brettlangdon deleted the vianney/add-native-writer branch August 8, 2025 16:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/no-changelog A changelog entry is not required for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants