Conversation
MrAlias
commented
Feb 23, 2026
- Design plan methodology for v2.0 of OBI config
- JSON Schema for v2.0
- Migration plan
- Examples and tooling
Move principles and user journeys into draft. Restructure, clarify, and make concise.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #1351 +/- ##
===========================================
+ Coverage 43.76% 68.45% +24.69%
===========================================
Files 308 277 -31
Lines 33495 32996 -499
===========================================
+ Hits 14658 22588 +7930
+ Misses 17894 9230 -8664
- Partials 943 1178 +235
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
NimrodAvni78
left a comment
There was a problem hiding this comment.
nice!
i know its in draft but wanted to give some input as well
There was a problem hiding this comment.
Pull request overview
This pull request introduces the v2.0 configuration schema for OBI (OpenTelemetry Binary Instrumentation), representing a comprehensive redesign of the configuration model to better align with OpenTelemetry's declarative configuration format and improve user experience.
Changes:
- Design documentation defining principles, user journeys, and configuration structure for v2.0
- JSON Schema definition for the
extensions.obisection with comprehensive validation rules - Migration plan outlining the strategy for transitioning from v1 to v2 configuration
- Example default configuration in v2 format with detailed comments
- Verification tooling (Go and Python) to validate schema correctness and ensure feature parity between v1 and v2
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| devdocs/config/version-2.0/config-v2.md | Design document describing principles, user journeys, and the target v2 configuration structure with detailed field mappings from v1 |
| devdocs/config/version-2.0/migration.md | Migration plan outlining parsing behavior, CLI tooling requirements, and phased rollout strategy |
| devdocs/config/version-2.0/obi-extension.schema.json | JSON Schema (Draft 2020-12) defining the complete v2 configuration structure for the extensions.obi section |
| devdocs/config/version-2.0/examples/default-configuration.yaml | Comprehensive example showing the default v2 configuration with inline comments and OTel integration |
| devdocs/config/version-2.0/verify.go | Go verification tool that validates feature parity between v1 defaults and v2 defaults through 94+ mapping checks |
| devdocs/config/version-2.0/validate_example.py | Python validation script that validates configuration files against both the OBI extension schema and OTel declarative schema |
| devdocs/config/version-2.0/.verify/dump_default_config.go | Utility to dump the current v1 default configuration for verification purposes |
| devdocs/config/version-2.0/.verify/default-config-current.yaml | Snapshot of the current v1 default configuration used as baseline for parity verification |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
|
Hi Tyler, thanks a lot for your awesome work! Quick question: One requirement that we are frequently seeing at Grafana is configuration per service. For example, if tracing causes issues for a shopping cart service, you might want to disable it for that specific service but keep it for all other services. Another example: You may want specific HTTP route matchers for individual services. Is per service configuration possible with the new config? If not, it would be great to add that. |
@fstab yes, that should be possible. As I have designed the configuration, something like this would address the user concern: extensions:
obi:
version: "2.0"
selection:
policy:
# Exclude all services not matched
default_action: exclude
rules:
- action: include
match:
process:
exe_path_glob:
- "/path/to/my_service" |
This is an interesting idea. I do not think it is possible in the current configuration, nor explicitly what I have specified here. I can take a look at the HTTP routes section a bit more and see about per-service matching. 👍 |
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
grcevski
left a comment
There was a problem hiding this comment.
This is fantastic! I really like the structure and the focus on what the end user wants to achieve.
I just have a comment on providing a way to override defaults for a selection -> rule. Given we run in a "daemonset" mode and instrument many services, more and more so, we've had the request to make certain settings be configurable per selection criteria.
It would be really nice if we could provide a way to override certain global settings.
mariomac
left a comment
There was a problem hiding this comment.
Amazing! I'd like to drop few minor comments.
Add `refine` block to selection rules for per-workload configuration overrides, and document the k8s enricher / Collector receiver boundary. Per-workload overrides (grcevski, fstab): - Add `SelectionRuleRefine` schema definition with explicit closed vocabulary: exports (traces/metrics), http.routes, http.filters - Add `refine` property to selection rule items in the schema - Add commented example in default-configuration.yaml showing signal disable and per-service HTTP route patterns - Document the refine block design in config-v2.md with examples Kubernetes enricher / Collector receiver (dmitryax): - Add `mode` field to enrich.enrichers.kubernetes in schema with autodetect/enabled/disabled options - Add documentation section in config-v2.md explaining the standalone vs receiver tradeoff and when to use k8sattributesprocessor - Annotate the example config's kubernetes.mode comment
Split the flat obi extension config into deployment-scoped sections:
- capture: receiver-embeddable block containing everything OBI needs to
select workloads and capture telemetry. Valid in all deployment modes.
When running OBI as a Collector receiver, this block is embedded
directly in the receiver configuration.
- policy + rules flattened to capture.policy / capture.rules
(removes the selection indirection for the 80% case)
- instrumentation, runtimes, network moved under capture
- operations.capture renamed to capture.engine (eBPF internals)
- operations.limits, safety, runtime.channels, telemetry (cache/TTL)
moved under capture.*
- enrich, correlation: standalone-mode only (unchanged paths)
- daemon: new section for OBI process controls (standalone only).
Contains logging, profiling, shutdown, internal_metrics, and
Prometheus-specific telemetry shaping. Replaces the daemon-facing
fields that were previously in operations.
Update obi-extension.schema.json, default-configuration.yaml,
verify.go, and config-v2.md (high-level shape, section descriptions,
and v1->v2 mapping table) to reflect new paths throughout.
All 85 verify.go parity checks pass. OBI and OTel schema validation pass.
Expand config-v2.md with rationale sections for each major structural choice: why capture is a named grouping (vs. flat + deployment flag), why policy/rules are direct children of capture (vs. nested under capture.selection), why refine uses a closed vocabulary (vs. deep-merge), why sampling stays in tracer_provider.sampler (vs. capture.rules refine), why engine not capture.capture, why enrich/correlation/daemon are standalone-only, and why daemon not operations. Update migration.md to reflect the new capture/daemon/enrich/correlation structure, add deployment-mode validation semantics, document what non-deterministic migration means with concrete examples, add rationale for keeping parser scope narrow (parse+validate only, not setup/routing), and explain the phased rollout rationale including why dual-read is necessary.
Design update —
|
|
@fstab — yes, both of your examples are now supported. The updated design adds a
Example covering both your cases: capture:
rules:
# Disable traces for shopping cart, keep metrics
- action: include
name: shopping-cart
match:
kubernetes:
namespace_glob: ["shopping-cart"]
refine:
exports:
traces: false
metrics: true
# Custom HTTP route matchers for orders service
- action: include
name: orders-service
match:
kubernetes:
namespace_glob: ["orders"]
refine:
http:
routes:
unmatched: wildcard
patterns:
- /orders/{id}
- /orders/{id}/itemsFor per-workload sampling overrides, the design keeps sampling in |
| # Delay before Java route template discovery to allow runtime readiness. | ||
| delay: 1m0s | ||
| # HTTP payload-level extraction features. | ||
| payload_extraction: |
There was a problem hiding this comment.
I think for all of these (and other protocols we infer on top of http) the current configuration is really complicated, needed a new field and env var per protocol, unlike the normal instrumentations field where its just a list of protocols, the only difference is that this detection is done over http, and probably needs http large buffers enabled to work reliably
i think we should just unify this config instrumentations config, maybe warn on startup / document that some of these wont work reliably without large buffers.
and allow for some unifying semantics (for example instead of specifying anthropic, openai, gemini we can allow for users to write genai, maybe something similar for other stuff like couchbase (KV + n1ql), aws (sqs and s3), elasticsearch (elasticsearch + opensearch), sql (mysql + postgresql + mssql) and so on.
this could maybe be fixed in OBI now or we can wait for config v2