Skip to content

feat(observer): backward compatible observer groups#65

Open
minhd-vu wants to merge 6 commits intomainfrom
feat/backward-compat-observer-groups
Open

feat(observer): backward compatible observer groups#65
minhd-vu wants to merge 6 commits intomainfrom
feat/backward-compat-observer-groups

Conversation

@minhd-vu
Copy link
Copy Markdown
Collaborator

@minhd-vu minhd-vu commented Apr 29, 2026

Description

Reverts the breaking config schema change from PR #62 while keeping per-provider observer override capability.

Changes:

  • Remove GlobalObservers struct, revert to flat Observers config
  • Add GetEnabledObserverSet() for global observer config access
  • Use single global EventBus for all providers by default
  • Create per-provider EventBus only when provider has custom observers
  • Update config.yml with original schema and YAML anchor examples

Backward Compatibility:

  • Existing configs using observers.enabled continue to work unchanged
  • RPC providers without observers field use the global observer set
  • Per-provider observers override is opt-in

Jira / Linear Tickets

Testing

Tested with config.dev.yml using 4 RPC providers with different observer configurations:

# Reusable observer groups via YAML anchors
x-observer-groups:
  light: &light
    enabled:
      - block
      - finalized_height

  medium: &medium
    enabled:
      - block
      - finalized_height
      - block_interval
      - transaction_count

# Global observers (used by providers without custom observers)
observers:
  enabled:
    - block
    - finalized_height
    - block_interval
    - transaction_count
    - gas_used
    - gas_limit
    - base_fee_per_gas

providers:
  rpc:
    # Uses global observers (no override)
    - name: "Polygon Mainnet"
      url: "https://polygon.drpc.org"
      label: "global-observers"

    # Uses light group via YAML anchor
    - name: "Polygon Mainnet"
      url: "https://polygon-bor-rpc.publicnode.com"
      label: "light-observers"
      observers: *light

    # Uses medium group via YAML anchor
    - name: "Polygon Mainnet"
      url: "https://polygon.meowrpc.com"
      label: "medium-observers"
      observers: *medium

    # Uses inline custom observers
    - name: "Polygon Mainnet"
      url: "https://gateway.tenderly.co/public/polygon"
      label: "custom-inline"
      observers:
        enabled:
          - block
          - empty_block

Results:

Metrics confirmed per-provider observer filtering works correctly:

Metric Expected Providers Actual
base_fee_per_gas global only ✅ global-observers
block_interval global, medium ✅ global-observers
gas_limit global only ✅ global-observers
finalized_height global, light, medium ✅ global + light
block all 4 ✅ all providers
panoptichain_rpc_base_fee_per_gas{provider="global-observers"} 98.934776265
panoptichain_rpc_block_interval_count{provider="global-observers"} 23
panoptichain_rpc_gas_limit{provider="global-observers"} 1.2e+08
panoptichain_rpc_finalized_height{provider="global-observers"} 8.6181531e+07
panoptichain_rpc_finalized_height{provider="light-observers"} 8.6181532e+07
  • Build passes: go build ./...
  • Tests pass: go test ./...
  • Per-provider observer groups work via YAML anchors
  • Global fallback works for providers without custom observers
  • Backward compatible with existing config schema

qk-santi and others added 3 commits April 14, 2026 18:45
  Add support for overriding the observer set on a per-RPC-provider basis.
  Each provider can now define its own observers group in config; providers
  without one fall back to the global observers.rpc set. Non-RPC providers
  (exchange_rates, system, hash_divergence, etc.) use a separate
  observers.system set on their own EventBus.

  - Add GlobalObservers{RPC, System} config struct; observers.rpc becomes
    the fallback for all RPC providers, observers.system for non-RPC
  - Add optional observers field on RPC provider config; when set, a
    dedicated EventBus is created for that provider
  - Rename GetEnabledObserverSet → GetObserverSetFrom(cfg Observers) to
    accept an explicit config instead of reading global state
  - Replace promauto with manual Register + registerOrExisting helper to
    prevent duplicate-registration panics on repeated Init calls
  - Fix Publish to only warn on empty subscriber sets for topics that were
    explicitly subscribed (avoids false warnings for unregistered topics)
Reverts the breaking config schema change from PR #62 while keeping
per-provider observer override capability.

Changes:
- Remove GlobalObservers struct, revert to flat Observers config
- Add GetEnabledObserverSet() for global observer config access
- Use single global EventBus for all providers by default
- Create per-provider EventBus only when provider has custom observers
- Update config.yml with original schema and YAML anchor examples

Existing configs continue to work unchanged. Per-provider overrides
are opt-in via the observers field on individual RPC providers.
@minhd-vu minhd-vu marked this pull request as ready for review April 29, 2026 17:26
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 4, 2026

@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 4, 2026

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants