Skip to content

Add beatreceiver OTEL telemetry#49300

Merged
blakerouse merged 11 commits into
elastic:mainfrom
blakerouse:beatreceiver-telementry
Mar 10, 2026
Merged

Add beatreceiver OTEL telemetry#49300
blakerouse merged 11 commits into
elastic:mainfrom
blakerouse:beatreceiver-telementry

Conversation

@blakerouse

@blakerouse blakerouse commented Mar 5, 2026

Copy link
Copy Markdown
Contributor

Proposed commit message

Adds a new RegistryBridge and SystemRegistryBridge that bridges the beats internal metrics to the OTEL internal telemetry. This is done in a way where all of the metrics are dynamically mapped (removing the need to manually create mappings).

The metrics are specifically kept in beats format using . as separators. That does provide a slight difference between OTEL telemetry which normally uses _.

The bridge is done using the callback registration that ensures that the metric values provided to OTEL telemetry are always the value at that point in time. This ensures there is no drift between reporting the metrics and the actual value at that time.

Checklist

  • My code follows the style guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • [ ] I have made corresponding change to the default configuration files
  • I have added tests that prove my fix is effective or that my feature works. Where relevant, I have used the stresstest.sh script to run them under stress conditions and race detector to verify their stability.
  • I have added an entry in ./changelog/fragments using the changelog tool.

Disruptive User Impact

None.

Author's Checklist

  • Provides the internal beats metrics as OTEL telemetry.

How to test this PR locally

Pull this commit into the elastic-agent and then build a package that works for your host. Run a similar config as below:

agent.internal.runtime.filebeat.filestream: otel
agent.logging.level: info
agent.logging.to_stderr: true
agent.monitoring.enabled: false
agent.grpc.port: 6790

inputs:
  - type: filestream
    id: filestream-test
    use_output: default
    streams:
      - id: stream-1
        data_stream:
          dataset: generic
          namespace: default
        paths:
          - /var/log/*.log

outputs:
  default:
    type: elasticsearch
    hosts: ["http://localhost:9200"]
    api_key: "changeme"

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: localhost:4317
exporters:
  file/telemetry:
    path: /tmp/otel-telemetry.json
service:
  telemetry:
    metrics:
      level: detailed
      readers:
        - periodic:
            interval: 5000
            exporter:
              otlp:
                protocol: grpc
                endpoint: localhost:4317
                insecure: true
  pipelines:
    metrics/telemetry:
      receivers: [otlp]
      exporters: [file/telemetry]

Related issues

Logs

Trimmed version of /tmp/otel-telemetry.json.

  {                                                                                                                                                                                                                                                                                           
    "scope": {                                                                                                                                                                                                                                                                              
      "name": "github.com/elastic/beats/v7/x-pack/otel/telemetry",                                                                                                                                                                                                                            
      "component_id": "filebeatreceiver/_agent-component/filestream-default/stream-1",
      "component_kind": "receiver",                                                                                                                                                                                                                                                           
      "signal": "logs"                                            
    },
    "metrics": [
      {
        "name": "libbeat.pipeline.clients",
        "type": "gauge",
        "dataPoints": [
          {
            "attributes": {
              "receiver": "filebeatreceiver/_agent-component/filestream-default/stream-1"
            },
            "value": 9
          }
        ]
      },
      {
        "name": "libbeat.pipeline.events.published",
        "type": "sum",
        "dataPoints": [
          {
            "attributes": {
              "receiver": "filebeatreceiver/_agent-component/filestream-default/stream-1"
            },
            "value": 3200
          }
        ]
      },
      {
        "name": "libbeat.pipeline.queue.filled.events",
        "type": "gauge",
        "dataPoints": [
          {
            "attributes": {
              "receiver": "filebeatreceiver/_agent-component/filestream-default/stream-1"
            },
            "value": 3200
          }
        ]
      },
      {
        "name": "libbeat.output.events.total",
        "type": "sum",
        "dataPoints": [
          {
            "attributes": {
              "receiver": "filebeatreceiver/_agent-component/filestream-default/stream-1"
            },
            "value": 20800
          }
        ]
      },
      {
        "name": "events_processed_total",
        "type": "sum",
        "dataPoints": [
          {
            "attributes": {
              "input_id": "stream-1",
              "input_type": "filestream",
              "receiver": "filebeatreceiver/_agent-component/filestream-default/stream-1"
            },
            "value": 3200
          }
        ]
      },
      {
        "name": "files_active",
        "type": "sum",
        "dataPoints": [
          {
            "attributes": {
              "input_id": "stream-1",
              "input_type": "filestream",
              "receiver": "filebeatreceiver/_agent-component/filestream-default/stream-1"
            },
            "value": 9
          }
        ]
      }
    ]
  }
@blakerouse blakerouse self-assigned this Mar 5, 2026
@blakerouse blakerouse added the Team:Elastic-Agent-Control-Plane Label for the Agent Control Plane team label Mar 5, 2026
@botelastic botelastic Bot added needs_team Indicates that the issue/PR needs a Team:* label and removed needs_team Indicates that the issue/PR needs a Team:* label labels Mar 5, 2026
@github-actions

github-actions Bot commented Mar 5, 2026

Copy link
Copy Markdown
Contributor

🤖 GitHub comments

Just comment with:

  • run docs-build : Re-trigger the docs validation. (use unformatted text in the comment!)
@mergify

mergify Bot commented Mar 5, 2026

Copy link
Copy Markdown
Contributor

This pull request does not have a backport label.
If this is a bug or security fix, could you label this PR @blakerouse? 🙏.
For such, you'll need to label your PR with:

  • The upcoming major version of the Elastic Stack
  • The upcoming minor version of the Elastic Stack (if you're not pushing a breaking change)

To fixup this pull request, you need to add the backport labels for the needed
branches, such as:

  • backport-8./d is the label to automatically backport to the 8./d branch. /d is the digit
  • backport-active-all is the label that automatically backports to all active branches.
  • backport-active-8 is the label that automatically backports to all active minor branches for the 8 major.
  • backport-active-9 is the label that automatically backports to all active minor branches for the 9 major.
@blakerouse blakerouse marked this pull request as ready for review March 6, 2026 15:45
@blakerouse blakerouse requested a review from a team as a code owner March 6, 2026 15:45
@elasticmachine

Copy link
Copy Markdown
Contributor

Pinging @elastic/elastic-agent-control-plane (Team:Elastic-Agent-Control-Plane)

@coderabbitai

coderabbitai Bot commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a changelog fragment and integrates OpenTelemetry into Beats by introducing a new RegistryBridge that dynamically maps monitoring registries to OTel async instruments, plus a process-wide SystemRegistryBridge for system metrics with reference-counted lifecycle. BeatReceiver and its constructor signature were extended to accept a receiver ID and TelemetrySettings, create and release the bridges on start/shutdown. The internal gauge-detection helper was exported as IsGauge. Call sites for NewBeatReceiver were updated to pass the new telemetry arguments. Comprehensive unit tests for both bridges were added.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • 🛠️ Update Documentation: Commit on current branch
  • 🛠️ Update Documentation: Create PR

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@x-pack/otel/telemetry/bridge.go`:
- Around line 328-333: The spawned goroutine in
callback/collectStats()/collectInputs() calls createAndReRegister which uses
ensureStatsInt, ensureStatsFloat, ensureInputInt and ensureInputFloat to mutate
instrument maps without synchronization; add locking inside those ensure*
functions so they acquire and defer b.mu.Unlock() (e.g., b.mu.Lock()/defer
b.mu.Unlock()) around any map reads/writes to prevent concurrent map access,
ensuring the functions (ensureStatsInt, ensureStatsFloat, ensureInputInt,
ensureInputFloat) are the single place that guard map access and avoiding
double-locks if callers already hold b.mu.
- Around line 157-164: Shutdown currently waits on b.reRegWg before removing the
registration which allows the re-register callback to call b.reRegWg.Add(1) and
panic; move the unregister step before waiting (i.e., acquire lock,
unregister/clear b.registration, release lock, then call b.reRegWg.Wait()) or
otherwise ensure the callback cannot Add after Shutdown begins; also eliminate
unsynchronized map access by protecting all reads of b.intGauges, b.floatGauges,
b.intCounters, b.floatCounters, etc. in collectStats() and collectInputs() with
b.mu (either lock around map iteration or copy the maps while holding b.mu and
iterate the copy without the lock) so that
createAndReRegister()/ensureStatsInt()/ensureStatsFloat() writes cannot race
with readers.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: cb20f2ec-c423-49f1-a8d6-3f3845769bca

📥 Commits

Reviewing files that changed from the base of the PR and between 46bdded and c11f49f.

📒 Files selected for processing (1)
  • x-pack/otel/telemetry/bridge.go
Comment thread x-pack/otel/telemetry/bridge.go
Comment thread x-pack/otel/telemetry/bridge.go
@cmacknz cmacknz requested a review from faec March 6, 2026 21:22
@cmacknz

cmacknz commented Mar 6, 2026

Copy link
Copy Markdown
Member

Haven't looked at the code yet, I assume there will be some work in https://github.com/elastic/elastic-agent/tree/main/internal/pkg/otel/receivers/elasticmonitoring to handle these coming in OTLP format now so we can avoid breaking the monitoring dashboards?

@elasticmachine

Copy link
Copy Markdown
Contributor

Pinging @elastic/elastic-agent-data-plane (Team:Elastic-Agent-Data-Plane)

@blakerouse

Copy link
Copy Markdown
Contributor Author

Haven't looked at the code yet, I assume there will be some work in https://github.com/elastic/elastic-agent/tree/main/internal/pkg/otel/receivers/elasticmonitoring to handle these coming in OTLP format now so we can avoid breaking the monitoring dashboards?

This PR at the moment is just the first step. It provides a bridge between beats metrics (scoped to a specific receiver) to the standard OTEL metrics. It does require setting up the telemetry readers in the collector configuration and figuring out how to get the metrics to elasticsearch in the same resulting format that was used by the dashboards.

service:
  telemetry:
    metrics:
      level: detailed
      readers:
        - periodic:
            interval: 5000
            exporter:
              otlp:
                protocol: grpc
                endpoint: localhost:4317
                insecure: true

This PR specifically scoped out the libbeat level metrics, but I could see those be registered only once (no matter the number of receivers) which seems possible with the otel collector. Which might then remove the need for elasticmonitoringreceiver and instead have those metrics come out the telemetry readers.

We need to discuss how to then go from telemetry readers to elasticsearch (ensuring that the resulting document format is the same).

@blakerouse

Copy link
Copy Markdown
Contributor Author

It does seem possible with telemetry.WithCreateMeterProvider and sdkmetric.WithReader(customReader) for the EDOT in supervised mode to implement a custom reader that could then route through the elasticmonitoringreceiver to elasticsearch. Or we stick with using OTLP which is more OTEL and use a processor possibly to get this into the correct format.

@cmacknz

cmacknz commented Mar 9, 2026

Copy link
Copy Markdown
Member

I think we'll want to expose the internal telemetry format directly in OTLP eventually, but as a choice. We need to keep the existing elastic agent integration dashboards and indices working in the ECS data model as the default for now to avoid forcing a breaking change on users here.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
x-pack/otel/telemetry/bridge.go (1)

343-349: ⚠️ Potential issue | 🔴 Critical

WaitGroup race: Add(1) called outside lock can race with Shutdown()'s Wait().

After releasing the lock at line 341, Add(1) at line 344 can race with Shutdown()'s Wait() at line 173. If Wait() returns before Add(1) executes, this violates WaitGroup semantics and causes undefined behavior.

Move the Add(1) inside the lock scope and guard it with a closed check:

🔒 Proposed fix
 	b.mu.Lock()
+	if b.closed {
+		b.mu.Unlock()
+		return nil
+	}
 	hasPending := len(b.pendingStatsInts) > 0 || len(b.pendingStatsFloats) > 0 ||
 		len(b.pendingInputInts) > 0 || len(b.pendingInputFloats) > 0
 	var statsInts, statsFloats, inputInts, inputFloats []string
 	if hasPending {
 		statsInts = b.pendingStatsInts
 		statsFloats = b.pendingStatsFloats
 		inputInts = b.pendingInputInts
 		inputFloats = b.pendingInputFloats
 		b.pendingStatsInts = nil
 		b.pendingStatsFloats = nil
 		b.pendingInputInts = nil
 		b.pendingInputFloats = nil
+		b.reRegWg.Add(1)
 	}
 	b.mu.Unlock()

 	if hasPending {
-		b.reRegWg.Add(1)
 		go func() {
 			defer b.reRegWg.Done()
 			b.createAndReRegister(statsInts, statsFloats, inputInts, inputFloats)
 		}()
 	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@x-pack/otel/telemetry/bridge.go` around lines 343 - 349, The WaitGroup Add(1)
for b.reRegWg is done outside the bridge lock and can race with Shutdown()'s
Wait(), causing undefined behavior; move b.reRegWg.Add(1) inside the same locked
critical section where hasPending is checked and, before spawning the goroutine
that calls b.createAndReRegister(...), verify the bridge isn't closed (e.g.,
check b.closed or the existing closed flag) so you only Add/Start the goroutine
when still open, and ensure Done() is still deferred inside the goroutine to
keep Wait/Done pairing correct.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@x-pack/otel/telemetry/bridge.go`:
- Around line 343-349: The WaitGroup Add(1) for b.reRegWg is done outside the
bridge lock and can race with Shutdown()'s Wait(), causing undefined behavior;
move b.reRegWg.Add(1) inside the same locked critical section where hasPending
is checked and, before spawning the goroutine that calls
b.createAndReRegister(...), verify the bridge isn't closed (e.g., check b.closed
or the existing closed flag) so you only Add/Start the goroutine when still
open, and ensure Done() is still deferred inside the goroutine to keep Wait/Done
pairing correct.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 96bb6907-e8f8-4816-8990-380157ba771c

📥 Commits

Reviewing files that changed from the base of the PR and between c11f49f and 4743ebc.

📒 Files selected for processing (2)
  • x-pack/otel/telemetry/bridge.go
  • x-pack/otel/telemetry/bridge_test.go
@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

I reviewed workflow run 22871350774 for this PR and there is no failure to investigate: the only job (pre-commit) completed successfully.

  • Job summary: pre-commitsuccess (all steps succeeded)
  • Failed jobs in run logs: 0
  • Root cause of failure: none observed in this run
  • Recommended action: no remediation needed for this run; if you want analysis of a failing check, share the failing run ID and I can break down the exact failing step and fix.

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

I investigated workflow run 22871350834 for this PR and found no failed checks.

  • Workflow: check-default
  • Overall conclusion: success
  • Jobs: check (success)
  • Failed jobs/steps: none

Root cause analysis is not applicable because the run completed successfully. No remediation is required.

Tests run in this investigation: none locally; reviewed GitHub Actions run/job status and failed-job logs (0 failed jobs).


What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Workflow run 22871350757 completed successfully, and I found no failing job or step to diagnose.

  • Run: golangci-lint on branch beatreceiver-telementry (4743ebcc3709a3b802b831016d2e6b844553db26)
  • Jobs checked: lint (ubuntu-latest), lint (macos-latest), lint (windows-latest)
  • Result: all jobs and golangci-lint steps concluded success
  • Root cause of failure: none (no failure present in this run)

Recommended action: no remediation needed for this workflow run. If you expected a failure, share the failing run ID/check URL and I can analyze that run’s failing step output.

Tests run in this investigation: none locally; analysis used GitHub Actions run and job metadata only.


What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@x-pack/otel/telemetry/bridge.go`:
- Around line 323-350: The callback path can spawn concurrent goroutines that
call createAndReRegister, causing duplicate OTel registrations; protect
re-registration with a single-flight mechanism (e.g., a dedicated mutex or
sync/singleflight.Group) so only one goroutine performs unregister+register at a
time: add a re-registration lock (name it reRegMu or use a singleflight.Group)
on RegistryBridge and acquire it inside the goroutine before calling
createAndReRegister, release it after, and keep using reRegWg.Done() in defer to
preserve shutdown tracking; update createAndReRegister invocation sites to
assume serialized re-registration and ensure any error handling still runs under
that protection.
- Around line 272-286: The current registerCallback stops after warning when
allInstruments() returns zero, which prevents dynamic discovery because
meter.RegisterCallback won't invoke the callback for an empty instrument list;
change registerCallback in RegistryBridge so that when len(instruments) == 0 it
actively triggers discovery instead of just warning — e.g., immediately invoke
the bridge's callback logic (so collectStats/collectInputs run at least once) or
start a short-lived background retry (ticker) that calls the callback and
re-checks allInstruments() until instruments are found, then proceeds to call
meter.RegisterCallback(b.callback, instruments...) and set b.registration under
b.mu; reference registerCallback, allInstruments, meter.RegisterCallback,
b.callback, collectStats, collectInputs, registration and mu when making the
change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2441ac4c-b746-474b-90ca-d7e243b4400b

📥 Commits

Reviewing files that changed from the base of the PR and between 4743ebc and 5d73a4e.

📒 Files selected for processing (1)
  • x-pack/otel/telemetry/bridge.go
Comment thread x-pack/otel/telemetry/bridge.go
Comment thread x-pack/otel/telemetry/bridge.go
@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Workflow run 22872909287 completed successfully, and there are no failed checks to debug.

  • Workflow: golangci-lint
  • Jobs inspected: lint (ubuntu-latest), lint (macos-latest), lint (windows-latest)
  • Result: all jobs concluded success (failed jobs: 0)
  • Root cause of failure: none detected
  • Remediation/fix: no action required

Tests/checks run for this investigation:

  • Queried workflow run metadata and job conclusions via Actions API
  • Queried failed job logs summary (failed_only=true) confirming no failed jobs

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Checked workflow run 22880032686 for this PR and there are no failing checks to debug.

  • Workflow: pre-commit
  • Job result: pre-commit (success)
  • Step status: all steps completed successfully
  • Log evidence: pre-commit run --show-diff-on-failure ... ended with check for merge conflicts................................................Passed

Root cause: none (no failure present in this run).

Recommended action: no fix needed for this run; if a different failed run is the target, share that run ID and I can analyze the failing step in detail.

Tests run in this investigation:

  • Queried workflow run/job metadata via Actions API
  • Retrieved job logs for job 66380521177
  • Retrieved failed-job logs summary (0 failed jobs)

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

I reviewed workflow run 22880032796 for this PR and there is no failure to diagnose: the run completed with success.

  • Workflow: check-default
  • Job: check (66380521584)
  • Job conclusion: success
  • Failing steps: none

Root cause summary: no failing check was found in this run, so no remediation is required for Actions on this execution.

Recommended follow-up: if you want failure analysis, share a run ID with conclusion: failure (or a specific failed job URL) and I can provide a targeted root-cause breakdown.

Tests run in this investigation:

  • GitHub Actions metadata/log inspection only (no local repo tests executed).

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

Copy link
Copy Markdown
Contributor

Checked workflow run 22880504323 for this PR: it completed successfully (pre-commit job, conclusion success), so there is no failing step to diagnose.

Root cause of failure: none observed in the run logs; the key check (check for merge conflicts) passed and the job exited cleanly.

Recommended action: no fix needed for this run; if you want extra assurance, re-run the same workflow after the next commit and only investigate if a job turns non-success.

Tests run (from this workflow):

  • pre-commit GitHub Actions job: ✅ passed

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

Copy link
Copy Markdown
Contributor

Workflow run 22880032712 completed successfully for this PR, and I could not find any failed job or failing step to diagnose.

What I checked

  • Jobs for the run: lint (ubuntu-latest), lint (macos-latest), lint (windows-latest) — all concluded success
  • Failed-job log query for the run reported: No failed jobs found in this workflow run

Root cause / remediation

  • No failure occurred in this run, so there is no root cause to report and no fix needed.
  • If you want, I can review a specific failed run ID instead.

Tests run

  • Queried workflow jobs and conclusions for run 22880032712
  • Queried failed job logs for run 22880032712 (0 failed jobs)

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

@github-actions

Copy link
Copy Markdown
Contributor

Workflow run 22880504326 failed only in lint (windows-latest) due to a dependency download failure, not a lint/code issue.

From the job log (0_lint (windows-latest).txt, lines 325-330):

  • 0 issues.
  • then typechecking error ... could not import github.com/google/flatbuffers/go ... read "https://proxy.golang.org/.../v25.2.10+incompatible.zip": stream error: ... INTERNAL_ERROR
  • golangci-lint exit with code 7

Root cause

Transient/network failure while fetching github.com/google/flatbuffers from proxy.golang.org during typechecking on the Windows runner.

Recommended remediation

  1. Re-run the failed check (likely to pass on retry).
  2. If this repeats, reduce fetch flakiness by pre-downloading modules before lint (e.g., go mod download) and/or adding retry around module fetch in CI bootstrap.

Tests run

  • Investigated workflow run/job metadata and downloaded logs.
  • Verified failure signature in the Windows job logs; no local code changes made.

What is this? | From workflow: PR Actions Detective

Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.

Comment thread x-pack/filebeat/fbreceiver/factory.go Outdated
Comment thread x-pack/otel/telemetry/bridge_test.go Outdated
@ebeahan ebeahan linked an issue Mar 10, 2026 that may be closed by this pull request
@blakerouse blakerouse merged commit df20dd7 into elastic:main Mar 10, 2026
208 checks passed
@blakerouse blakerouse deleted the beatreceiver-telementry branch March 10, 2026 18:13
strawgate pushed a commit that referenced this pull request Mar 11, 2026
Adds a new RegistryBridge and SystemRegistryBridge that bridges the beats internal metrics to the OTEL internal telemetry. This is done in a way where all of the metrics are dynamically mapped (removing the need to manually create mappings).

The metrics are specifically kept in beats format using . as separators. That does provide a slight difference between OTEL telemetry which normally uses _.

The bridge is done using the callback registration that ensures that the metric values provided to OTEL telemetry are always the value at that point in time. This ensures there is no drift between reporting the metrics and the actual value at that time.
belimawr pushed a commit to belimawr/beats that referenced this pull request Mar 12, 2026
Adds a new RegistryBridge and SystemRegistryBridge that bridges the beats internal metrics to the OTEL internal telemetry. This is done in a way where all of the metrics are dynamically mapped (removing the need to manually create mappings).

The metrics are specifically kept in beats format using . as separators. That does provide a slight difference between OTEL telemetry which normally uses _.

The bridge is done using the callback registration that ensures that the metric values provided to OTEL telemetry are always the value at that point in time. This ensures there is no drift between reporting the metrics and the actual value at that time.
belimawr pushed a commit to belimawr/beats that referenced this pull request Mar 12, 2026
Adds a new RegistryBridge and SystemRegistryBridge that bridges the beats internal metrics to the OTEL internal telemetry. This is done in a way where all of the metrics are dynamically mapped (removing the need to manually create mappings).

The metrics are specifically kept in beats format using . as separators. That does provide a slight difference between OTEL telemetry which normally uses _.

The bridge is done using the callback registration that ensures that the metric values provided to OTEL telemetry are always the value at that point in time. This ensures there is no drift between reporting the metrics and the actual value at that time.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Team:Elastic-Agent-Control-Plane Label for the Agent Control Plane team Team:Elastic-Agent-Data-Plane Label for the Agent Data Plane team

5 participants