feat: standard OpAMP protobuf + e2e integration status - #120
Merged
Merged
Conversation
zzylol
force-pushed
the
pr/window-optimizer-gaps
branch
7 times, most recently
from
April 4, 2026 19:35
670cac9 to
e029122
Compare
Completes the OTel config delivery chain: 1. sketchcol builder: add opampextension + awss3exporter - OpAMP: controller pushes config updates to running collectors - S3: raw data backup path (paper §3 Fig.1) 2. config-with-opamp.yaml: collector connects to controller via OpAMP WebSocket, receives config pushes at runtime (no restart) 3. config-dual-path.yaml: dual pipeline — sketch path (fast, approximate) + S3 path (raw backup for ad-hoc queries) Config delivery options (ordered by capability): a) httpprovider: one-shot fetch at startup (already on main) b) OpAMP: push-based, runtime config updates (this PR) c) Per-metric: GET /api/v1/config/:metric (already on main) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
zzylol
force-pushed
the
pr/otel-integration
branch
from
April 4, 2026 19:54
c3655ed to
c357a51
Compare
Rewrites the controller's OpAMP server to speak the standard OpAMP
protobuf protocol (open-telemetry/opamp-spec), replacing the custom
JSON wire format. The opampextension in OTel Collectors can now
connect directly.
Controller changes:
- proto/opamp.proto + proto/anyvalue.proto: OpAMP spec protobuf
- build.rs: prost-build compiles proto at build time
- Cargo.toml: +prost, +bytes, +prost-build
- opamp/mod.rs:
- Send: RemoteConfig → ServerToAgent { remote_config: AgentRemoteConfig {
config: AgentConfigMap { "": AgentConfigFile { body: yaml_bytes } } } }
as protobuf binary WebSocket frame
- Receive: decode AgentToServer protobuf (effective_config, health)
- Backward compat: still accepts legacy JSON AgentStatus text frames
- encode_remote_config() builds standard OpAMP ServerToAgent message
- Tests updated to decode protobuf instead of JSON
This means the controller can now push sketch configs (sketch type,
parameters, window duration, label matchers, delta settings) to
running collectors at runtime — the exact YAML that
generate_agent_config() produces is wrapped in standard OpAMP framing.
sketchcol changes:
- builder-config.yaml: +opampextension, +awss3exporter
- config-with-opamp.yaml: collector with OpAMP extension connecting to controller
- config-dual-path.yaml: sketch pipeline + S3 raw backup (paper §3 Fig.1)
329 tests pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SieDeta
pushed a commit
that referenced
this pull request
Apr 17, 2026
* feat: sketchcol OpAMP extension + S3 dual-path + config examples
Completes the OTel config delivery chain:
1. sketchcol builder: add opampextension + awss3exporter
- OpAMP: controller pushes config updates to running collectors
- S3: raw data backup path (paper §3 Fig.1)
2. config-with-opamp.yaml: collector connects to controller via
OpAMP WebSocket, receives config pushes at runtime (no restart)
3. config-dual-path.yaml: dual pipeline — sketch path (fast,
approximate) + S3 path (raw backup for ad-hoc queries)
Config delivery options (ordered by capability):
a) httpprovider: one-shot fetch at startup (already on main)
b) OpAMP: push-based, runtime config updates (this PR)
c) Per-metric: GET /api/v1/config/:metric (already on main)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: standard OpAMP protobuf protocol + sketchcol OpAMP + S3 dual-path
Rewrites the controller's OpAMP server to speak the standard OpAMP
protobuf protocol (open-telemetry/opamp-spec), replacing the custom
JSON wire format. The opampextension in OTel Collectors can now
connect directly.
Controller changes:
- proto/opamp.proto + proto/anyvalue.proto: OpAMP spec protobuf
- build.rs: prost-build compiles proto at build time
- Cargo.toml: +prost, +bytes, +prost-build
- opamp/mod.rs:
- Send: RemoteConfig → ServerToAgent { remote_config: AgentRemoteConfig {
config: AgentConfigMap { "": AgentConfigFile { body: yaml_bytes } } } }
as protobuf binary WebSocket frame
- Receive: decode AgentToServer protobuf (effective_config, health)
- Backward compat: still accepts legacy JSON AgentStatus text frames
- encode_remote_config() builds standard OpAMP ServerToAgent message
- Tests updated to decode protobuf instead of JSON
This means the controller can now push sketch configs (sketch type,
parameters, window duration, label matchers, delta settings) to
running collectors at runtime — the exact YAML that
generate_agent_config() produces is wrapped in standard OpAMP framing.
sketchcol changes:
- builder-config.yaml: +opampextension, +awss3exporter
- config-with-opamp.yaml: collector with OpAMP extension connecting to controller
- config-dual-path.yaml: sketch pipeline + S3 raw backup (paper §3 Fig.1)
329 tests pass.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Rewrites the controller's OpAMP WebSocket server to speak the standard OpAMP
protobuf protocol. Adds OpAMP extension and S3 exporter to the sketchcol builder.
E2E Integration Test Results (real test, not simulated)
curl /api/v1/agentsreturns{}{"test-agent-1":"agent"}POST /api/v1/plan→ planner → YAML → OpAMP pushagents_notified: 1, sketch_type: KLLServerToAgent { remote_config }binary frameAcceptsRemoteConfigRoot cause
The
opampextensionin opentelemetry-collector-contrib does not implementAcceptsRemoteConfig. It only supports:ReportsEffectiveConfig— reports current config to serverReportsHealth— reports health statusReportsAvailableComponents— reports available componentsIt does NOT support:
AcceptsRemoteConfig— receive and apply config from serverThis is a known limitation of the upstream extension. The OpAMP spec defines
AcceptsRemoteConfigas a capability, but the Go implementation doesn't have it.Potential solutions
AcceptsRemoteConfigto the Go extension — decodeServerToAgent.remote_config, write YAML to confmap, trigger collector reloadhttpproviderwith a watcher that pollsGET /api/v1/config/:metricperiodically; controller updates the config, collector re-fetchesfileproviderwith--config file:config.yaml; fsnotify triggers reload on file changeAcceptsRemoteConfigto opampextensionRecommended path: Solution A (OpAMP Supervisor) for immediate use, then Solution E
(upstream contribution) for long-term. The supervisor approach is the officially
recommended way to use OpAMP for remote config in the OTel ecosystem.
What this PR still delivers (works today)
GET /api/v1/config/:metricserves YAML on demandFiles changed (8 files, +1382 −18)
proto/opamp.proto(+1079)proto/anyvalue.proto(+67)build.rs(+7)Cargo.toml(+5)src/opamp/mod.rs(+106 −18)sketchcol/builder-config.yaml(+8 −1)sketchcol/config-dual-path.yaml(+76)sketchcol/config-with-opamp.yaml(+52)Tests
push_to_role_delivers_yaml_to_agent_role— protobuf binary encode → WebSocket → decode → verify YAML body + hashpush_to_agent_role_does_not_reach_backend_role— role-based routing verified with protobuf🤖 Generated with Claude Code