Skip to content

Commit 1a4d28c

Browse files
[8.19](backport #47154) beatconverter: Ignore disabled elasticsearch output (#47559)
* beatconverter: Ignore disabled elasticsearch output (#47154) ## Proposed commit message Similar to the logstash output: https://github.com/elastic/beats/blob/52c5045638c8116550dba017bb455802577a5513/libbeat/otelbeat/beatconverter/beatconverter.go#L82-L85 Fixes #46113 ## How to test this PR locally filebeat.yaml: ```yaml filebeat.inputs: - type: filestream id: my-filestream-id enabled: true paths: - /path/to/file.json output.elasticsearch: enabled: false hosts: ["localhost:9200"] ``` compile: `cd x-pack/filebeat/ && mage buildOtel` test with: 1. `x-pack/filebeat/filebeat -c filebeat.yaml -e` 2. `x-pack/filebeat/filebeat otel --config filebeat-task.yaml` ## Related issues - Closes #46113 ## Logs ### Before ``` 2025-10-16T11:39:52.274+0200 DEBUG elasticsearch/config_otel.go:222 Failed to get queue size: missing field accessing 'queue' 2025-10-16T11:39:52.298+0200 info instance/beat.go:178 Home path: [.] Config path: [.] Data path: [./data] Logs path: [./logs] {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.298+0200 info instance/beat.go:186 Beat ID: 440437c7-3a3f-409a-ba2e-5aa89d0ab790 {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.324+0200 info publisher pipeline/module.go:105 Beat name: laptop {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.325+0200 error modules fileset/modules.go:157 Not loading modules. Module directory not found: module {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.325+0200 warn beater/filebeat.go:174 Filebeat is unable to load the ingest pipelines for the configured modules because the Elasticsearch output is not configured/enabled. If you have already loaded the ingest pipelines or are using Logstash pipelines, you can ignore this warning. {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.325+0200 info builders/extension.go:50 Development component. May change in the future. {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "beatsauth", "otelcol.component.kind": "extension"} 2025-10-16T11:39:52.330+0200 info [email protected]/service.go:222 Starting otel... {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "Version": "9.3.0", "NumCPU": 12} 2025-10-16T11:39:52.330+0200 info extensions/extensions.go:41 Starting extensions... {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}} 2025-10-16T11:39:52.330+0200 info extensions/extensions.go:45 Extension is starting... {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "beatsauth", "otelcol.component.kind": "extension"} 2025-10-16T11:39:52.331+0200 info extensions/extensions.go:62 Extension started. {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "beatsauth", "otelcol.component.kind": "extension"} 2025-10-16T11:39:52.331+0200 info [email protected]/service.go:245 Everything is ready. Begin running and processing data. {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}} 2025-10-16T11:39:52.331+0200 info fbreceiver/receiver.go:27 starting filebeat receiver {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.332+0200 info filebeat memlog/store.go:134 Finished loading transaction log file for '/home/orestis/src/beats/data/registry/filebeat'. Active transaction id=0 {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "store": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.333+0200 warn beater/filebeat.go:406 Filebeat is unable to load the ingest pipelines for the configured modules because the Elasticsearch output is not configured/enabled. If you have already loaded the ingest pipelines or are using Logstash pipelines, you can ignore this warning. {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.333+0200 info registrar registrar/registrar.go:103 States Loaded from registrar: 0 {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.333+0200 info crawler beater/crawler.go:76 Loading Inputs: 1 {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.334+0200 info crawler beater/crawler.go:148 Starting input (ID: 1771212043283374986) {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.334+0200 info crawler beater/crawler.go:111 Loading and starting Inputs completed. Enabled inputs: 1 {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.334+0200 info input.filestream compat/compat.go:141 Input 'filestream' starting {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "id": "my-filestream-id", "ecs.version": "1.6.0"} 2025-10-16T11:39:52.335+0200 info input.filestream.metric_registry inputmon/input.go:182 registering {"resource": {"service.instance.id": "1f0db8b8-b116-48be-8dfc-bb2aff2578e6", "service.name": "otel", "service.version": "9.3.0"}, "otelcol.component.id": "filebeatreceiver", "otelcol.component.kind": "receiver", "otelcol.signal": "logs", "service.name": "filebeat", "id": "my-filestream-id", "registry_id": "my-filestream-id", "input_id": "my-filestream-id", "input_type": "filestream", "ecs.version": "1.6.0"} ``` ### After ``` x-pack/filebeat/filebeat otel --config filebeat-task.yaml Error: invalid configuration: no exporter configuration specified in config service::pipelines::logs: must have at least one exporter Usage: filebeat otel [flags] filebeat otel [command] Available Commands: inspect Run this command to inspect the OTel configuration translated from the Beats config Flags: --config string path to filebeat config file (default "filebeat-otel.yml") -h, --help help for otel Global Flags: -E, --E setting=value Configuration overwrite -M, --M setting=value Module configuration overwrite -c, --c string Configuration file, relative to path.config (default "filebeat.yml") -d, --d string Enable certain debug selectors -e, --e Log to stderr and disable syslog/file output --environment environmentVar set environment being ran in (default default) --path.config string Configuration path --path.data string Data path --path.home string Home path --path.logs string Logs path --plugin pluginList Load additional plugins --strict.perms Strict permission checking on config files (default true) -v, --v Log at INFO level Use "filebeat otel [command] --help" for more information about a command. ``` (cherry picked from commit f1267b8) # Conflicts: # libbeat/otelbeat/beatconverter/beatconverter_test.go * fix conflicts --------- Co-authored-by: Orestis Floros <[email protected]>
1 parent 2039314 commit 1a4d28c

File tree

2 files changed

+61
-18
lines changed

2 files changed

+61
-18
lines changed

libbeat/otelbeat/beatconverter/beatconverter.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ func (c Converter) Convert(_ context.Context, conf *confmap.Conf) error {
7777
switch key {
7878
case "elasticsearch":
7979
esConfig := config.MustNewConfigFrom(output)
80+
81+
// ignore elasticsearch output if it is not enabled
82+
if !esConfig.Enabled() {
83+
continue
84+
}
85+
8086
// we use development logger here as this method is part of dev-only otel command
8187
logger, _ := logp.NewDevelopmentLogger("")
8288
esOTelConfig, err := elasticsearchtranslate.ToOTelConfig(esConfig, logger)

libbeat/otelbeat/beatconverter/beatconverter_test.go

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ exporters:
6464
mode: bodymap
6565
compression: gzip
6666
compression_params:
67-
level: 1
67+
level: 1
6868
auth:
69-
authenticator: beatsauth
69+
authenticator: beatsauth
7070
`
7171

7272
func TestConverter(t *testing.T) {
@@ -211,7 +211,7 @@ exporters:
211211
max_retries: 3
212212
user: elastic-cloud
213213
logs_dynamic_pipeline:
214-
enabled: true
214+
enabled: true
215215
max_conns_per_host: 1
216216
sending_queue:
217217
batch:
@@ -230,7 +230,7 @@ exporters:
230230
compression_params:
231231
level: 1
232232
auth:
233-
authenticator: beatsauth
233+
authenticator: beatsauth
234234
receivers:
235235
filebeatreceiver:
236236
filebeat:
@@ -326,6 +326,43 @@ service:
326326
compareAndAssert(t, expOutput, input)
327327

328328
})
329+
330+
t.Run("test elasticsearch exporter with enabled false", func(t *testing.T) {
331+
var supportedInput = `
332+
receivers:
333+
filebeatreceiver:
334+
output:
335+
elasticsearch:
336+
enabled: false
337+
hosts: ["https://localhost:9200"]
338+
service:
339+
pipelines:
340+
logs:
341+
receivers:
342+
- "filebeatreceiver"
343+
`
344+
345+
var expectedOutput = `
346+
receivers:
347+
filebeatreceiver:
348+
output:
349+
otelconsumer: null
350+
service:
351+
telemetry:
352+
metrics:
353+
level: none
354+
pipelines:
355+
logs:
356+
receivers:
357+
- filebeatreceiver
358+
`
359+
input := newFromYamlString(t, supportedInput)
360+
err := c.Convert(context.Background(), input)
361+
require.NoError(t, err, "error converting beats elasticsearch-output config")
362+
363+
expOutput := newFromYamlString(t, expectedOutput)
364+
compareAndAssert(t, expOutput, input)
365+
})
329366
}
330367

331368
func TestLogLevel(t *testing.T) {
@@ -418,25 +455,25 @@ service:
418455
pipelines:
419456
logs:
420457
receivers:
421-
- filebeatreceiver
458+
- filebeatreceiver
422459
`
423460

424461
commonOTelCfg := `
425462
extensions:
426463
beatsauth:
427464
idle_connection_timeout: 3s
428465
proxy_disable: false
429-
timeout: 1m30s
466+
timeout: 1m30s
430467
receivers:
431468
filebeatreceiver:
432469
output:
433-
otelconsumer: null
470+
otelconsumer: null
434471
exporters:
435472
elasticsearch:
436473
endpoints:
437474
- http://localhost:9200
438475
logs_dynamic_pipeline:
439-
enabled: true
476+
enabled: true
440477
retry:
441478
enabled: true
442479
initial_interval: 1s
@@ -446,7 +483,7 @@ exporters:
446483
password: changeme
447484
user: elastic
448485
mapping:
449-
mode: bodymap
486+
mode: bodymap
450487
compression: gzip
451488
compression_params:
452489
level: 1
@@ -473,7 +510,7 @@ service:
473510
exporters:
474511
- elasticsearch
475512
receivers:
476-
- filebeatreceiver
513+
- filebeatreceiver
477514
`
478515

479516
tests := []struct {
@@ -490,7 +527,7 @@ receivers:
490527
events: 3200
491528
flush:
492529
min_events: 1600
493-
timeout: 10s
530+
timeout: 10s
494531
extensions:
495532
beatsauth:
496533
idle_connection_timeout: 3s
@@ -502,7 +539,7 @@ exporters:
502539
max_size: 1600
503540
num_consumers: 1
504541
queue_size: 3200
505-
max_conns_per_host: 1
542+
max_conns_per_host: 1
506543
`,
507544
},
508545
{
@@ -515,7 +552,7 @@ receivers:
515552
events: 12800
516553
flush:
517554
min_events: 1600
518-
timeout: 5s
555+
timeout: 5s
519556
extensions:
520557
beatsauth:
521558
idle_connection_timeout: 15s
@@ -527,7 +564,7 @@ exporters:
527564
max_size: 1600
528565
num_consumers: 4
529566
queue_size: 12800
530-
max_conns_per_host: 4
567+
max_conns_per_host: 4
531568
`,
532569
},
533570
{
@@ -540,7 +577,7 @@ receivers:
540577
events: 3200
541578
flush:
542579
min_events: 1600
543-
timeout: 20s
580+
timeout: 20s
544581
extensions:
545582
beatsauth:
546583
idle_connection_timeout: 1s
@@ -555,7 +592,7 @@ exporters:
555592
max_conns_per_host: 1
556593
retry:
557594
initial_interval: 5s
558-
max_interval: 5m0s
595+
max_interval: 5m0s
559596
`,
560597
},
561598
{
@@ -568,7 +605,7 @@ receivers:
568605
events: 4100
569606
flush:
570607
min_events: 2050
571-
timeout: 1s
608+
timeout: 1s
572609
extensions:
573610
beatsauth:
574611
idle_connection_timeout: 1m0s
@@ -583,7 +620,7 @@ exporters:
583620
max_conns_per_host: 1
584621
retry:
585622
initial_interval: 1s
586-
max_interval: 1m0s
623+
max_interval: 1m0s
587624
`}}
588625

589626
commonOTeMap := newFromYamlString(t, commonOTelCfg)

0 commit comments

Comments
 (0)