Skip to content

Conversation

@mabdinur
Copy link
Contributor

@mabdinur mabdinur commented Oct 14, 2025

What does this PR do?

Extracts common OTLP functionality into base classes to eliminate expected code duplication between otel logs and metrics.

Motivation

Prepare for metrics implementation by creating shared infrastructure. Reduces ~400 lines of duplicate code and ensures consistency.

Changes

New Base Classes:

  • otlp/otlp_http_exporter_base.js - Shared HTTP export logic (URL parsing, request handling, headers, telemetry)
  • otlp/otlp_transformer_base.js - Shared transformation logic (attributes, resources, scopes, serialization)

Refactored Files:

  • logs/otlp_http_log_exporter.js - Now extends base class
  • logs/otlp_transformer.js - Now extends base class
  • test/opentelemetry/logs.spec.js - Updated mocking paths

Benefits

  • Single source of truth for HTTP/transformation logic
  • Easier to maintain and debug
  • Consistent behavior across signal types
  • Cleaner code for future metrics implementation (and maybe even otlp trace/profiling support)

Testing

  • All existing logs tests pass
  • No functionality changes
  • No linter errors

Plugin Checklist

Additional Notes

- Add metrics.proto and metrics_service.proto (OTLP v1 spec)
- Update protobuf_loader to support metrics protos
- Rename protos/ -> otlp/ directory for better organization
- Create OtlpHttpExporterBase for shared HTTP export logic
- Create OtlpTransformerBase for shared transformation logic
- Refactor logs exporter/transformer to extend base classes
- Update test mocking paths
- Eliminates ~400 lines of duplication
@github-actions
Copy link

github-actions bot commented Oct 14, 2025

Overall package size

Self size: 12.78 MB
Deduped: 115.39 MB
No deduping: 117.59 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.7.0 | 35.02 MB | 35.02 MB | | @datadog/native-appsec | 10.2.1 | 20.64 MB | 20.65 MB | | @datadog/native-iast-taint-tracking | 4.0.0 | 11.72 MB | 11.73 MB | | @datadog/pprof | 5.11.1 | 9.96 MB | 10.34 MB | | @opentelemetry/core | 1.30.1 | 908.66 kB | 7.16 MB | | protobufjs | 7.5.4 | 2.95 MB | 5.73 MB | | @datadog/wasm-js-rewriter | 4.0.1 | 2.85 MB | 3.58 MB | | @opentelemetry/resources | 1.9.1 | 306.54 kB | 1.74 MB | | @datadog/native-metrics | 3.1.1 | 1.02 MB | 1.43 MB | | @opentelemetry/api-logs | 0.205.0 | 201.51 kB | 1.42 MB | | @opentelemetry/api | 1.9.0 | 1.22 MB | 1.22 MB | | jsonpath-plus | 10.3.0 | 617.18 kB | 1.08 MB | | import-in-the-middle | 1.15.0 | 127.66 kB | 856.24 kB | | lru-cache | 10.4.3 | 804.3 kB | 804.3 kB | | @datadog/openfeature-node-server | 0.1.0-preview.10 | 95.11 kB | 401.46 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | source-map | 0.7.6 | 185.63 kB | 185.63 kB | | pprof-format | 2.2.1 | 163.06 kB | 163.06 kB | | @datadog/sketches-js | 2.1.1 | 109.9 kB | 109.9 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 7.0.5 | 63.38 kB | 63.38 kB | | istanbul-lib-coverage | 3.2.2 | 34.37 kB | 34.37 kB | | rfdc | 1.4.1 | 27.15 kB | 27.15 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB | | @isaacs/ttlcache | 1.4.1 | 25.2 kB | 25.2 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | shell-quote | 1.8.3 | 23.74 kB | 23.74 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | semifies | 1.0.0 | 15.84 kB | 15.84 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | ttl-set | 1.0.0 | 4.61 kB | 9.69 kB | | mutexify | 1.4.0 | 5.71 kB | 8.74 kB | | path-to-regexp | 0.1.12 | 6.6 kB | 6.6 kB | | module-details-from-path | 1.0.4 | 3.96 kB | 3.96 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@codecov
Copy link

codecov bot commented Oct 14, 2025

Codecov Report

❌ Patch coverage is 86.60714% with 15 lines in your changes missing coverage. Please review.
✅ Project coverage is 84.03%. Comparing base (dc2f39d) to head (97a3cae).
⚠️ Report is 7 commits behind head on master.

Files with missing lines Patch % Lines
.../src/opentelemetry/otlp/otlp_http_exporter_base.js 84.48% 9 Missing ⚠️
...ce/src/opentelemetry/otlp/otlp_transformer_base.js 85.36% 6 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #6659      +/-   ##
==========================================
- Coverage   84.12%   84.03%   -0.09%     
==========================================
  Files         503      496       -7     
  Lines       21010    20763     -247     
==========================================
- Hits        17674    17448     -226     
+ Misses       3336     3315      -21     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@pr-commenter
Copy link

pr-commenter bot commented Oct 14, 2025

Benchmarks

Benchmark execution time: 2025-10-16 22:07:25

Comparing candidate commit 97a3cae in PR branch munir/otlp-refactor-base-classes with baseline commit dc2f39d in branch master.

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

@mabdinur mabdinur marked this pull request as ready for review October 14, 2025 20:57
@mabdinur mabdinur requested a review from a team as a code owner October 14, 2025 20:57
@mabdinur mabdinur requested review from BridgeAR and removed request for a team October 14, 2025 20:57
Base automatically changed from munir/otlp-infrastructure to master October 16, 2025 21:48
@mabdinur
Copy link
Contributor Author

9 Missing ⚠️

Base classes are missing test coverage because they are not tested directly. They will have full test coverage in the follow up PR: https://app.codecov.io/gh/DataDog/dd-trace-js/pull/6654/indirect-changes

Copy link
Collaborator

@khanayan123 khanayan123 left a comment

Choose a reason for hiding this comment

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

Overall LGTM. Minor NIT: can we create a opentelemetry/exporters subfolder and add otlp_http_exporter_base.js there, same with a opentelemetry/transformers subfolder and add otlp_transformer_base there? we can make maybe even remove the prefix from the two files once it's moved and just call it base?

@mabdinur
Copy link
Contributor Author

Overall LGTM. Minor NIT: can we create a opentelemetry/exporters subfolder and add otlp_http_exporter_base.js there, same with a opentelemetry/transformers subfolder and add otlp_transformer_base there? we can make maybe even remove the prefix from the two files once it's moved and just call it base?

I get the idea, but I’d keep the current layout for now. Right now we’ve got:

  • opentelemetry/logs
  • opentelemetry/otlp (which has the base exporter, transformer, and all the proto files)
  • .... trace specific files

Keeping all the OTLP serialization logic together in otlp/ makes things a bit easier to manage until we add opentelemetry/metrics in a follow-up. Once that change lands we can break things up into whatever structor makes the most sense. I don't have strong opinions here. Also this branch is also the target for 4 more PRs, so refactoring into new exporters/transformers subfolders now could complicate things and cause extra merge conflicts.

@mabdinur mabdinur merged commit d69f98a into master Oct 17, 2025
758 of 760 checks passed
@mabdinur mabdinur deleted the munir/otlp-refactor-base-classes branch October 17, 2025 17:26
dd-octo-sts bot pushed a commit that referenced this pull request Oct 18, 2025
* feat: add OTLP metrics proto definitions and reorganize directory

- Add metrics.proto and metrics_service.proto (OTLP v1 spec)
- Update protobuf_loader to support metrics protos
- Rename protos/ -> otlp/ directory for better organization

* refactor: extract common OTLP logic into base classes

- Create OtlpHttpExporterBase for shared HTTP export logic
- Create OtlpTransformerBase for shared transformation logic
- Refactor logs exporter/transformer to extend base classes
- Update test mocking paths
- Eliminates ~400 lines of duplication

* fix logs

* add support for encoding attributes
@dd-octo-sts dd-octo-sts bot mentioned this pull request Oct 18, 2025
juan-fernandez pushed a commit that referenced this pull request Oct 22, 2025
* feat: add OTLP metrics proto definitions and reorganize directory

- Add metrics.proto and metrics_service.proto (OTLP v1 spec)
- Update protobuf_loader to support metrics protos
- Rename protos/ -> otlp/ directory for better organization

* refactor: extract common OTLP logic into base classes

- Create OtlpHttpExporterBase for shared HTTP export logic
- Create OtlpTransformerBase for shared transformation logic
- Refactor logs exporter/transformer to extend base classes
- Update test mocking paths
- Eliminates ~400 lines of duplication

* fix logs

* add support for encoding attributes
jordan-wong pushed a commit that referenced this pull request Oct 28, 2025
* feat: add OTLP metrics proto definitions and reorganize directory

- Add metrics.proto and metrics_service.proto (OTLP v1 spec)
- Update protobuf_loader to support metrics protos
- Rename protos/ -> otlp/ directory for better organization

* refactor: extract common OTLP logic into base classes

- Create OtlpHttpExporterBase for shared HTTP export logic
- Create OtlpTransformerBase for shared transformation logic
- Refactor logs exporter/transformer to extend base classes
- Update test mocking paths
- Eliminates ~400 lines of duplication

* fix logs

* add support for encoding attributes
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.

3 participants