Skip to content

Commit 9b8b7a8

Browse files
committed
tests: integration: cover downstream listener workers
Signed-off-by: Eduardo Silva <eduardo@chronosphere.io>
1 parent 9acc914 commit 9b8b7a8

11 files changed

Lines changed: 547 additions & 0 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
service:
2+
flush: 1
3+
grace: 1
4+
log_level: info
5+
http_server: on
6+
http_port: ${FLUENT_BIT_HTTP_MONITORING_PORT}
7+
8+
pipeline:
9+
inputs:
10+
- name: forward
11+
listen: 127.0.0.1
12+
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
13+
tls: on
14+
tls.crt_file: ${CERTIFICATE_TEST}
15+
tls.key_file: ${PRIVATE_KEY_TEST}
16+
workers: 4
17+
18+
outputs:
19+
- name: http
20+
match: test
21+
host: 127.0.0.1
22+
port: ${TEST_SUITE_HTTP_PORT}
23+
uri: /data
24+
format: json
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
service:
2+
flush: 1
3+
grace: 1
4+
log_level: info
5+
http_server: on
6+
http_port: ${FLUENT_BIT_HTTP_MONITORING_PORT}
7+
8+
pipeline:
9+
inputs:
10+
- name: forward
11+
listen: 127.0.0.1
12+
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
13+
workers: 4
14+
15+
outputs:
16+
- name: http
17+
match: test
18+
host: 127.0.0.1
19+
port: ${TEST_SUITE_HTTP_PORT}
20+
uri: /data
21+
format: json

tests/integration/scenarios/in_forward/tests/test_in_forward_001.py

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import tempfile
1111
import time
1212
import uuid
13+
from concurrent.futures import ThreadPoolExecutor
1314
from pathlib import Path
1415

1516
import opentelemetry
@@ -104,6 +105,7 @@ def _stop_receiver(self, service):
104105

105106
def start(self):
106107
self.service.start()
108+
self.flb = self.service.flb
107109
self.flb_listener_port = self.service.flb_listener_port
108110

109111
def stop(self):
@@ -136,6 +138,9 @@ def wait_for_log_contains(self, text, timeout=10):
136138
description=f"log text {text!r}",
137139
)
138140

141+
def wait_for_log_message(self, pattern, timeout=10):
142+
return self.wait_for_log_contains(pattern, timeout)
143+
139144

140145
class StorageLimitService(Service):
141146
def __init__(self, config_file):
@@ -842,6 +847,62 @@ def test_in_forward_forward_mode_multiple_entries():
842847
assert [record["message"] for record in records[:2]] == ["entry-1", "entry-2"]
843848

844849

850+
def test_in_forward_workers_concurrent_message_mode_records():
851+
total_records = 16
852+
service = Service("in_forward_workers.yaml")
853+
service.start()
854+
855+
try:
856+
service.wait_for_log_message("with 4 workers", timeout=10)
857+
payloads = [
858+
_message_mode_payload(TEST_TAG, {"message": f"worker-{i}", "value": i})
859+
for i in range(total_records)
860+
]
861+
with ThreadPoolExecutor(max_workers=total_records) as executor:
862+
list(executor.map(
863+
lambda payload: _send_tcp_payload(service.flb_listener_port, payload),
864+
payloads,
865+
))
866+
records = service.wait_for_record_count(total_records, timeout=20)
867+
finally:
868+
service.stop()
869+
870+
values = sorted(record["value"] for record in records)
871+
assert values == list(range(total_records))
872+
873+
874+
def test_in_forward_workers_drop_partial_connections_and_continue():
875+
dropped_connections = 8
876+
valid_records = 8
877+
service = Service("in_forward_workers.yaml")
878+
service.start()
879+
880+
try:
881+
service.wait_for_log_message("with 4 workers", timeout=10)
882+
# Send partial MessagePack bytes and close to exercise drop cleanup.
883+
with ThreadPoolExecutor(max_workers=dropped_connections) as executor:
884+
list(executor.map(
885+
lambda _: _send_tcp_payload(service.flb_listener_port, b"\x93\xa4test"),
886+
range(dropped_connections),
887+
))
888+
889+
payloads = [
890+
_message_mode_payload(TEST_TAG, {"message": f"valid-{i}", "value": i})
891+
for i in range(valid_records)
892+
]
893+
with ThreadPoolExecutor(max_workers=valid_records) as executor:
894+
list(executor.map(
895+
lambda payload: _send_tcp_payload(service.flb_listener_port, payload),
896+
payloads,
897+
))
898+
records = service.wait_for_record_count(valid_records, timeout=20)
899+
finally:
900+
service.stop()
901+
902+
values = sorted(record["value"] for record in records)
903+
assert values == list(range(valid_records))
904+
905+
845906
def test_in_forward_packed_forward_gzip():
846907
service = Service("in_forward.yaml")
847908
service.start()
@@ -1079,6 +1140,65 @@ def test_in_forward_tls_idle_connection_timeout_churn(monkeypatch):
10791140
assert any(record.get("message") == "after-churn" for record in records)
10801141

10811142

1143+
def test_in_forward_tls_workers_concurrent_message_mode_records():
1144+
total_records = 16
1145+
service = Service("in_forward_tls_workers.yaml")
1146+
service.start()
1147+
1148+
try:
1149+
service.wait_for_log_message("with 4 workers", timeout=10)
1150+
with ThreadPoolExecutor(max_workers=total_records) as executor:
1151+
list(executor.map(
1152+
lambda i: _send_tls_payload(service.flb_listener_port,
1153+
_message_mode_payload(
1154+
TEST_TAG,
1155+
{"message": f"tls-worker-{i}",
1156+
"value": i}),
1157+
service.tls_crt_file),
1158+
range(total_records),
1159+
))
1160+
records = service.wait_for_record_count(total_records, timeout=20)
1161+
finally:
1162+
service.stop()
1163+
1164+
values = sorted(record["value"] for record in records)
1165+
assert values == list(range(total_records))
1166+
1167+
1168+
def test_in_forward_tls_workers_drop_bad_handshakes_and_continue():
1169+
dropped_connections = 8
1170+
valid_records = 8
1171+
service = Service("in_forward_tls_workers.yaml")
1172+
service.start()
1173+
1174+
try:
1175+
service.wait_for_log_message("with 4 workers", timeout=10)
1176+
# Send raw non-TLS bytes and close to exercise handshake cleanup.
1177+
with ThreadPoolExecutor(max_workers=dropped_connections) as executor:
1178+
list(executor.map(
1179+
lambda i: _send_tcp_payload(service.flb_listener_port,
1180+
f"not-tls-{i}".encode("utf-8")),
1181+
range(dropped_connections),
1182+
))
1183+
1184+
with ThreadPoolExecutor(max_workers=valid_records) as executor:
1185+
list(executor.map(
1186+
lambda i: _send_tls_payload(service.flb_listener_port,
1187+
_message_mode_payload(
1188+
TEST_TAG,
1189+
{"message": f"valid-tls-{i}",
1190+
"value": i}),
1191+
service.tls_crt_file),
1192+
range(valid_records),
1193+
))
1194+
records = service.wait_for_record_count(valid_records, timeout=20)
1195+
finally:
1196+
service.stop()
1197+
1198+
values = sorted(record["value"] for record in records)
1199+
assert values == list(range(valid_records))
1200+
1201+
10821202
def test_in_forward_secure_forward_auth_success():
10831203
service = Service("in_forward_secure.yaml")
10841204
service.start()

tests/integration/scenarios/in_http_max_connections/config/in_http_max_connections.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pipeline:
1212
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
1313
http_server.idle_timeout: 2s
1414
http_server.max_connections: 1
15+
http_server.workers: 2
1516

1617
outputs:
1718
- name: http

tests/integration/scenarios/in_opentelemetry/tests/test_in_opentelemetry_001.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,3 +1565,37 @@ def test_in_opentelemetry_http_workers_respect_ingress_queue_byte_limit():
15651565
"fluentbit_input_http_server_ingress_queue_pending_bytes",
15661566
"opentelemetry.0",
15671567
) == 0
1568+
1569+
1570+
def test_in_opentelemetry_http_workers_account_metrics_payload_bytes():
1571+
service = Service(IN_OPENTELEMETRY_TINY_INGRESS_QUEUE_BYTE_LIMIT_CONFIG)
1572+
small_payload = service.build_otel_payload("test_metrics_001.in.json", "metrics")
1573+
1574+
small_request = ExportMetricsServiceRequest()
1575+
small_request.ParseFromString(small_payload)
1576+
1577+
large_request = ExportMetricsServiceRequest()
1578+
for _ in range(16):
1579+
large_request.resource_metrics.extend(small_request.resource_metrics)
1580+
1581+
large_payload = large_request.SerializeToString()
1582+
1583+
assert len(small_payload) < 2000
1584+
assert len(large_payload) > 2000
1585+
1586+
service.start()
1587+
service.wait_for_log_message("with 4 workers", timeout=10)
1588+
metrics_before = len(data_storage["metrics"])
1589+
1590+
try:
1591+
success_response = service.send_raw_request("/v1/metrics", small_payload)
1592+
assert success_response.status_code == 201
1593+
service.wait_for_signal_count("metrics", metrics_before + 1, timeout=10)
1594+
1595+
failure_response = service.send_raw_request("/v1/metrics", large_payload)
1596+
assert failure_response.status_code == 503
1597+
assert "deferred ingress queue is full" in failure_response.text
1598+
finally:
1599+
service.stop()
1600+
1601+
assert len(data_storage["metrics"]) == metrics_before + 1
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
service:
2+
flush: 1
3+
grace: 1
4+
log_level: info
5+
http_server: on
6+
http_port: ${FLUENT_BIT_HTTP_MONITORING_PORT}
7+
parsers_file: ${PARSERS_FILE_TEST}
8+
9+
pipeline:
10+
inputs:
11+
- name: tcp
12+
tag: target_input
13+
listen: 127.0.0.1
14+
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
15+
format: none
16+
separator: "\\n"
17+
parser: json
18+
tls: on
19+
tls.crt_file: ${CERTIFICATE_TEST}
20+
tls.key_file: ${PRIVATE_KEY_TEST}
21+
workers: 4
22+
23+
outputs:
24+
- name: http
25+
match: target_input
26+
host: 127.0.0.1
27+
port: ${TEST_SUITE_HTTP_PORT}
28+
uri: /data
29+
format: json
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
service:
2+
flush: 1
3+
grace: 1
4+
log_level: info
5+
http_server: on
6+
http_port: ${FLUENT_BIT_HTTP_MONITORING_PORT}
7+
parsers_file: ${PARSERS_FILE_TEST}
8+
9+
pipeline:
10+
inputs:
11+
- name: tcp
12+
tag: target_input
13+
listen: 127.0.0.1
14+
port: ${FLUENT_BIT_TEST_LISTENER_PORT}
15+
format: none
16+
separator: "\\n"
17+
parser: json
18+
workers: 4
19+
20+
outputs:
21+
- name: http
22+
match: target_input
23+
host: 127.0.0.1
24+
port: ${TEST_SUITE_HTTP_PORT}
25+
uri: /data
26+
format: json

0 commit comments

Comments
 (0)