elastic / elastic/logstash

[meta] Flakey bundled plugins from #logstash-plugin-ci

Open
#19,452 2 comments 0 reactions 1 assignee Claimed by @donoghuc View on GitHub
Dominant language
Java
Stars
14.9k
Forks
3.5k
Avg merge
1d 4h
Merged PRs (30d)
88

Description

# Flaky test analysis — logstash-plugins scheduled CI failures

Source: `oblt-robot-ci` Slack failure notifications. Investigation via `gh` CLI (read-only)
against each run's `--log-failed` output and job matrix. Date of analysis: 2026-08-20.

## Method

For each run the failed-job log was downloaded and the RSpec summary, failing example
name, and error signature extracted. The job matrix was inspected to see whether the
failure was isolated to a single stack/branch cell (a strong flaky signal) or reproduced
across all cells.

## Classification key

- **Test race** — intermittent, timing-dependent assertion or socket/thread race in the spec.
- **Concurrency** — thread-safety defect (unsynchronized shared state) crashing a worker thread.
- **Hang/timeout** — job killed by the 60-minute step timeout; test deadlocks/hangs.
- **Infra** — CI environment failure (Docker image pull i/o timeout, missing DRA build, setup step); not a plugin/test bug.

## Summary

| Plugin | Runs (IDs) | Failing test / step | Signature | Verdict |Assignee|PR|Merged|
|---|---|---|---|---|---|---|---|
| logstash-output-tcp | 31783808676, 32009100050 | `spec/outputs/tcp_spec.rb:194` register | `register` raises `ConfigurationError`; `ECONNREFUSED` on client connect | Flaky — test race |@andsel|https://github.com/logstash-plugins/logstash-output-tcp/pull/73| ✅ |
| logstash-integration-snmp | 31783846781, 32009105537, 32347392451 | Setup / install step | `Install failed with an unexpected code: 1` (Docker) | Flaky — infra |@andsel|https://github.com/logstash-plugins/logstash-integration-snmp/pull/98| ✅|
| logstash-input-elasticsearch | 31784088299 | Setup / image pull | `docker.elastic.co … i/o timeout` (ES 9.5.1) | Flaky — infra |@andsel| NO FIX | [spurious](https://github.com/elastic/logstash/issues/19452#issuecomment-5476527008)|
| logstash-output-elasticsearch | 31784049577, 31873619940, 32347652832 | Integration specs (index template / bulk) | `Connection refused … port 9200` — ES not ready | Flaky — infra/env |@andsel| https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1285 | ✅|
| logstash-input-tcp | 31784048596, 32114939230, 32231316548 | Run tests step | `timed out after 60 minutes`; connect-refused retry loop | Flaky — hang/timeout |@andsel|[issue](https://github.com/logstash-plugins/logstash-input-tcp/issues/285) [PR](https://github.com/logstash-plugins/logstash-input-tcp/pull/286)|✅|
| logstash-input-ganglia | 31873726335, 31935726847, 32115237611 | `spec/inputs/ganglia_spec.rb:61/73` | UDP "should receive the correct data/value/name" | Flaky — test race ||||
| logstash-filter-translate | 31873735909, 31935728649, 32115232167 | `spec/filters/scheduling_spec.rb:197` | reload "expected 11, got 1" | Flaky — test race |@andsel|https://github.com/logstash-plugins/logstash-filter-translate/pull/117| ✅|
| logstash-mixin-scheduler | 31873773968, 31935751921, 32009785840 | Run tests step | `timed out after 60 minutes` | Flaky — hang/timeout |@andsel | [issue](https://github.com/logstash-plugins/logstash-mixin-scheduler/issues/9) ||
| logstash-output-http | 31935473675 | `spec/outputs/http_spec.rb:496` | "keeps retrying due a protocol exception" | Flaky — test race |@andsel| [investigation PR](https://github.com/logstash-plugins/logstash-output-http/pull/163) [issue](https://github.com/logstash-plugins/logstash-output-http/issues/164) https://github.com/logstash-plugins/logstash-output-http/pull/165 ||
| logstash-input-file | 31935589000, 32114901771 | `spec/inputs/file_read_spec.rb:345` | "cleans up sincedb entry" | Flaky — test race |@andsel| [issue](https://github.com/logstash-plugins/logstash-input-file/issues/337) [PR](https://github.com/logstash-plugins/logstash-input-file/pull/338) ||
| logstash-input-elastic_serverless_forwarder | 31935741498 | SSL client-auth cert-rejection examples | intermittent `bad_certificate`/`certificate_required` | Flaky — test race (TLS) ||||
| logstash-output-lumberjack | 32009744611 | Run tests step | `0 failures` but exit 1; server thread `RuntimeError: crashed` | Flaky — thread exception leak | @donoghuc | https://github.com/logstash-plugins/logstash-output-lumberjack/pull/37 | ✅|
| logstash-integration-kafka | 32009180665, 32409673361 | `spec/integration/outputs/kafka_spec.rb:177` | "distribute events to all partitions"; `Unable to poll Kafka consumer` + Fatal assertion | Flaky — test race ||||
| logstash-input-beats | 32009491400 | Run tests step | `0 failures` but exit 1; `Zlib::GzipFile::Error: Unexpected end of ZLIB input stream` | Flaky — test race |@andsel|https://github.com/logstash-plugins/logstash-input-beats/pull/578|✅ |
| logstash-input-redis | 32114916361 | `spec/inputs/redis_spec.rb:35` | "should read events from a list"; `events[1000]` nil → `NoMethodError` | Flaky — test race ||||
| logstash-input-http_poller | 32115257090 | Setup test environment | single cell failed in 9s, 15 cells passed | Flaky — infra/setup |||
| logstash-codec-multiline | 32231288604 | `spec/codecs/identity_map_codec_spec.rb` | `ConcurrencyError: … unsynchronized modifications` | Flaky — concurrency |@andsel|https://github.com/logstash-plugins/logstash-codec-multiline/pull/79|✅ |
| logstash-input-http | 32347870269 | Setup / image pull | `docker.elastic.co … i/o timeout` (logstash 8.19.20) | Flaky — infra ||||

All 18 plugins are flaky; none show a deterministic, reproducible product bug. They split
into three buckets: **test races/concurrency** (11), **hang/timeout** (2), and **CI infra**
(5).

---

## Per-plugin detail

### logstash-output-tcp — flaky (test race)
- Runs: [31783808676](https://github.com/logstash-plugins/logstash-output-tcp/actions/runs/31783808676) (Stack 8.current), [32009100050](https://github.com/logstash-plugins/logstash-output-tcp/actions/runs/32009100050) (Stack 9.previous snapshot).
- Only one matrix cell failed; every other stack/branch passed the same commit.
- `36 examples, 1 failure`. Failing example at `spec/outputs/tcp_spec.rb:194`:
`expect { subject.register }.to_not raise_error` → `got LogStash::ConfigurationError`.
- Also `Errno::ECONNREFUSED` connecting to `localhost:1000` from `tcp_spec.rb:54`.
- Signature is a register/SSL-setup + client-connect race in the spec harness, not a code defect.

### logstash-integration-snmp — flaky (infra)
- Runs: [31783846781](https://github.com/logstash-plugins/logstash-integration-snmp/actions/runs/31783846781) (unit), [32009105537](https://github.com/logstash-plugins/logstash-integration-snmp/actions/runs/32009105537) (integration), [32347392451](https://github.com/logstash-plugins/logstash-integration-snmp/actions/runs/32347392451) (integration).
- No RSpec failures. Fails at environment setup with `Install failed with an unexpected code: 1`.
- Docker/DRA image acquisition failure — CI infrastructure, not a test bug.

### logstash-input-elasticsearch — flaky (infra)
- Run: [31784088299](https://github.com/logstash-plugins/logstash-input-elasticsearch/actions/runs/31784088299).
- `failed to do request: Head "https://docker.elastic.co/v2/elasticsearch/elasticsearch/manifests/9.5.1": dial tcp … i/o timeout`.
- Image-pull timeout during setup. Infra.

### logstash-output-elasticsearch — flaky (infra/env)
- Runs: [31784049577](https://github.com/logstash-plugins/logstash-output-elasticsearch/actions/runs/31784049577), [31873619940](https://github.com/logstash-plugins/logstash-output-elasticsearch/actions/runs/31873619940), [32347652832](https://github.com/logstash-plugins/logstash-output-elasticsearch/actions/runs/32347652832) (all integration).
- `136 examples, 1–2 failures`. Repeated `curl: (7) Failed to connect to elasticsearch port 9200: Connection refused`.
- The ES container is not ready/healthy when the integration specs run — environment timing, not plugin logic.

### logstash-input-tcp — flaky (hang/timeout)
- Runs: [31784048596](https://github.com/logstash-plugins/logstash-input-tcp/actions/runs/31784048596) (main snapshot), [32114939230](https://github.com/logstash-plugins/logstash-input-tcp/actions/runs/32114939230) (9.previous), [32231316548](https://github.com/logstash-plugins/logstash-input-tcp/actions/runs/32231316548) (9.previous).
- `The action 'Run tests' has timed out after 60 minutes.`
- Preceded by `Connection refused - connect(2) for "127.0.0.1" port …` retry loops; a spec deadlocks/hangs on a socket, never completing.

### logstash-input-ganglia — flaky (test race)
- Runs: [31873726335](https://github.com/logstash-plugins/logstash-input-ganglia/actions/runs/31873726335), [31935726847](https://github.com/logstash-plugins/logstash-input-ganglia/actions/runs/31935726847), [32115237611](https://github.com/logstash-plugins/logstash-input-ganglia/actions/runs/32115237611).
- `7 examples, 1 failure`, and the failing example varies between cells: `ganglia_spec.rb:61` "should receive the correct data", `:73` "should receive the value", and "should receive the name".
- UDP receive-timing race: the assertion runs before the datagram is processed. The varying failing example across cells confirms non-determinism.

### logstash-filter-translate — flaky (test race)
- Runs: [31873735909](https://github.com/logstash-plugins/logstash-filter-translate/actions/runs/31873735909), [31935728649](https://github.com/logstash-plugins/logstash-filter-translate/actions/runs/31935728649), [32115232167](https://github.com/logstash-plugins/logstash-filter-translate/actions/runs/32115232167).
- `55 examples, 1 failure` at `spec/filters/scheduling_spec.rb:197` — "scheduled reloading merge uses the merged dictionary after reload":
`expected: "11", got: "1"`.
- The assertion samples the dictionary before the scheduled reload thread has merged the update — scheduler timing race.

### logstash-mixin-scheduler — flaky (hang/timeout)
- Runs: [31873773968](https://github.com/logstash-plugins/logstash-mixin-scheduler/actions/runs/31873773968), [31935751921](https://github.com/logstash-plugins/logstash-mixin-scheduler/actions/runs/31935751921), [32009785840](https://github.com/logstash-plugins/logstash-mixin-scheduler/actions/runs/32009785840).
- `The action 'Run tests' has timed out after 60 minutes.` A scheduler spec hangs and never returns.

### logstash-output-http — flaky (test race)
- Run: [31935473675](https://github.com/logstash-plugins/logstash-output-http/actions/runs/31935473675).
- `264 examples, 1 failure` at `spec/outputs/http_spec.rb:496` — "with supported_protocols set to (disabled) 1.1 keeps retrying due a protocol exception".
- Retry-count/timing expectation that depends on how many retries elapse in a fixed window — race.

### logstash-input-file — flaky (test race)
- Runs: [31935589000](https://github.com/logstash-plugins/logstash-input-file/actions/runs/31935589000), [32114901771](https://github.com/logstash-plugins/logstash-input-file/actions/runs/32114901771).
- `143 examples, 1 failure` at `spec/inputs/file_read_spec.rb:345` — "delete on complete with sincedb cleanup enabled cleans up sincedb entry".
- Filesystem/sincedb-flush timing race between the reader thread and the assertion.

### logstash-input-elastic_serverless_forwarder — flaky (test race, TLS)
- Run: [31935741498](https://github.com/logstash-plugins/logstash-input-elastic_serverless_forwarder/actions/runs/31935741498).
- `36 examples, 1 failure, 2 pending`. Failing examples rotate among the SSL client-authentication cert-rejection cases (`ssl_client_authentication => required/optional`, self-signed / mismatched SAN, `ssl_verification_mode => full`) expecting a `bad_certificate`/`certificate_required` rejection.
- TLS handshake-timing race: the rejection sometimes surfaces as a different/absent error than asserted.

### logstash-output-lumberjack — flaky (thread exception leak)
- Run: [32009744611](https://github.com/logstash-plugins/logstash-output-lumberjack/actions/runs/32009744611).
- RSpec reports `2 examples, 0 failures` but the job exits `1`.
- Lumberjack server threads terminate with `RuntimeError: crashed` / `Whoa we shouldn't get this frame:` (`jls-lumberjack … server.rb:70`). These are deliberately-injected failures in `lumberjack_spec.rb`, but with `report_on_exception` the thread crash escapes and forces a non-zero process exit — an unclean-teardown flake, not an assertion failure.

### logstash-integration-kafka — flaky (test race)
- Runs: [32009180665](https://github.com/logstash-plugins/logstash-integration-kafka/actions/runs/32009180665) (main), [32409673361](https://github.com/logstash-plugins/logstash-integration-kafka/actions/runs/32409673361) (11.x).
- `44 examples, 1 failure` at `spec/integration/outputs/kafka_spec.rb:177` — "when using multi partition topic should distribute events to all partitions".
- `Unable to poll Kafka consumer` and `Exception in thread "kafka-input-worker-test-0" java.lang.AssertionError: Fatal assertion` — broker/partition-assignment timing race; partition distribution not yet balanced when asserted.

### logstash-input-beats — flaky (test race)
- Run: [32009491400](https://github.com/logstash-plugins/logstash-input-beats/actions/runs/32009491400).
- Both cells report `262 examples, 0 failures`, yet the job is red.
- `Zlib::GzipFile::Error: Unexpected end of ZLIB input stream` — a compressed-payload spec crashed on a truncated/incomplete stream (network/timing), aborting the process after the summary.

### logstash-input-redis — flaky (test race)
- Run: [32114916361](https://github.com/logstash-plugins/logstash-input-redis/actions/runs/32114916361).
- `6 examples, 1 failure` at `spec/inputs/redis_spec.rb:35` — "should read events from a list":
`expect(events[1000].get('sequence')).to eq(1000)` → `NoMethodError` (`events[1000]` is nil).
- Not all 1001 events were delivered before the assertion; also `IOError: closed stream` during teardown. Data-delivery timing race.

### logstash-input-http_poller — flaky (infra/setup)
- Run: [32115257090](https://github.com/logstash-plugins/logstash-input-http_poller/actions/runs/32115257090).
- Only `Stack 9.current` (5.x branch) failed, at `Setup test environment` after 9s; the other 15 matrix cells passed. Environment-setup infra flake.

### logstash-codec-multiline — flaky (concurrency)
- Run: [32231288604](https://github.com/logstash-plugins/logstash-codec-multiline/actions/runs/32231288604).
- Exit code 1 with `ConcurrencyError: Detected invalid array contents due to unsynchronized modifications with concurrent users` from the `IdentityMapCodec#map_cleanup` thread (`spec/codecs/identity_map_codec_spec.rb:134`).
- Genuine thread-safety defect in the identity-map cleanup path exercised by concurrent spec threads; manifests intermittently.

### logstash-input-http — flaky (infra)
- Run: [32347870269](https://github.com/logstash-plugins/logstash-input-http/actions/runs/32347870269).
- `docker.elastic.co/logstash/logstash:8.19.20 … Head … i/o timeout`. Image-pull timeout during setup. Infra.

---

## Notes

- The five **infra** cases (snmp, input-elasticsearch, output-elasticsearch, http_poller, input-http) are Docker image-pull / container-readiness / setup timeouts and are not fixable in plugin code; they recur across many repos and point at registry/runner flakiness.
- The **hang/timeout** cases (input-tcp, mixin-scheduler) waste a full 60-minute runner each; worth prioritising as they are the most expensive.
- `logstash-codec-multiline`'s `ConcurrencyError` is the one signature that reflects a real (thread-safety) bug rather than pure test timing, even though it surfaces intermittently.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.