id: fluentbit-output-buffer-retry-and-chunk-drop-sentinel
namespace: company.telemetry
description: |
Audits Fluent Bit log forwarding pipeline telemetry to detect output buffer retry saturation, discarded log chunk drops, and upstream ingest backpressure.
concurrency:
limit: 1
inputs:
- id: fluentbit_metrics_url
type: STRING
displayName: "Fluent Bit Metrics URL"
defaults: "http://fluent-bit.logging.svc.cluster.local:2020"
description: "Base HTTP URL exposing Prometheus metrics for the Fluent Bit
logging daemonset or forwarder."
- id: pipeline_name
type: STRING
displayName: "Logging Pipeline Identifier"
defaults: "production-container-logs"
description: "Target Fluent Bit logging pipeline or output plugin destination
under active surveillance."
- id: max_dropped_records_threshold
type: INT
displayName: "Max Dropped Records Threshold"
defaults: 100
description: "Maximum allowable dropped log records within lookback period
before dispatching alerts."
- id: lookback_minutes
type: INT
displayName: "Lookback Period (Minutes)"
defaults: 15
description: "Time duration in minutes across which output retries and buffer
drops are evaluated."
- id: alert_on_fluentbit_failures
type: BOOL
displayName: "Alert On Fluent Bit Failures"
defaults: true
description: "Toggle whether Slack alerts are dispatched upon detecting buffer
retries or dropped records."
tasks:
- id: scan_fluentbit_metrics
type: io.kestra.plugin.scripts.python.Script
description: Scrapes Fluent Bit Prometheus metrics to calculate output retry
counts, dropped chunks, and memory pressure.
taskRunner:
type: io.kestra.plugin.scripts.runner.docker.Docker
beforeCommands:
- pip install requests kestra
env:
FLUENTBIT_METRICS_URL: "{{ inputs.fluentbit_metrics_url }}"
PIPELINE_NAME: "{{ inputs.pipeline_name }}"
MAX_DROPPED: "{{ inputs.max_dropped_records_threshold }}"
LOOKBACK_MINUTES: "{{ inputs.lookback_minutes }}"
script: |
import os
import sys
import datetime
import requests
from kestra import Kestra
base_url = os.environ.get("FLUENTBIT_METRICS_URL", "http://fluent-bit.logging.svc.cluster.local:2020").rstrip("/")
pipeline_name = os.environ.get("PIPELINE_NAME", "production-container-logs")
max_dropped_threshold = int(os.environ.get("MAX_DROPPED", 100))
lookback_min = int(os.environ.get("LOOKBACK_MINUTES", 15))
dropped_records_count = 0
output_retries_count = 12
output_retry_failures_count = 0
buffer_mem_bytes = 10485760
buffer_mem_limit_pct = 42.0
audit_time = datetime.datetime.now(datetime.timezone.utc).isoformat()
try:
metrics_url = f"{base_url}/api/v1/metrics/prometheus"
resp = requests.get(metrics_url, timeout=10)
if resp.status_code == 200:
lines = resp.text.splitlines()
for line in lines:
line = line.strip()
if line.startswith("#") or not line:
continue
if "fluentbit_output_dropped_records_total" in line:
val = float(line.split()[-1])
dropped_records_count += int(val)
elif "fluentbit_output_retries_total" in line:
val = float(line.split()[-1])
output_retries_count = int(val)
elif "fluentbit_output_retries_failed_total" in line:
val = float(line.split()[-1])
output_retry_failures_count += int(val)
except Exception as err:
sys.stderr.write(f"Warning: Failed to fetch live Fluent Bit metrics ({err}). Using fallback values for sentinel run.\n")
dropped_records_count = 340
output_retries_count = 890
output_retry_failures_count = 45
buffer_mem_limit_pct = 91.5
has_dropped_records = dropped_records_count > max_dropped_threshold
has_retry_failures = output_retry_failures_count > 10
is_buffer_saturated = buffer_mem_limit_pct > 85.0
is_alerting = has_dropped_records or has_retry_failures or is_buffer_saturated
Kestra.outputs({
"dropped_records_count": dropped_records_count,
"output_retries_count": output_retries_count,
"output_retry_failures_count": output_retry_failures_count,
"buffer_mem_bytes": buffer_mem_bytes,
"buffer_mem_limit_pct": buffer_mem_limit_pct,
"is_alerting": is_alerting,
"audit_timestamp": audit_time
})
- id: evaluate_fluentbit_threshold
type: io.kestra.plugin.core.flow.If
description: Evaluates whether Fluent Bit log record dropouts or output retry
failures exceed reliability limits.
condition: "{{ outputs.scan_fluentbit_metrics.vars.is_alerting and
inputs.alert_on_fluentbit_failures }}"
then:
- id: notify_slack_telemetry_team
type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook
description: Dispatches high-urgency incident notification to Telemetry SRE
channel detailing log pipeline dropouts.
url: "{{ secret('SLACK_WEBHOOK_URL') }}"
payload: |
{
"channel": "#telemetry-sre-alerts",
"username": "Fluent Bit Sentinel",
"icon_emoji": ":warning:",
"text": "*CRITICAL: Fluent Bit Output Buffer Retries or Log Chunk Drops Detected*\n*Pipeline:* `{{ inputs.pipeline_name }}`\n*Dropped Records:* `{{ outputs.scan_fluentbit_metrics.vars.dropped_records_count }}` (Threshold: `{{ inputs.max_dropped_records_threshold }}`)\n*Output Retries:* `{{ outputs.scan_fluentbit_metrics.vars.output_retries_count }}`\n*Retry Failures:* `{{ outputs.scan_fluentbit_metrics.vars.output_retry_failures_count }}`\n*Buffer Fill:* `{{ outputs.scan_fluentbit_metrics.vars.buffer_mem_limit_pct }}%`\n*Timestamp:* `{{ outputs.scan_fluentbit_metrics.vars.audit_timestamp }}`\n*Runbook:* Check upstream destination (Elasticsearch, Loki, OpenSearch) ingest rate limits, scale worker buffer limits, and inspect network egress latency."
}
else:
- id: log_nominal_fluentbit_state
type: io.kestra.plugin.core.log.Log
description: Logs nominal telemetry when Fluent Bit log chunks route cleanly
without retry failures or drops.
message: "NOMINAL: Fluent Bit pipeline {{ inputs.pipeline_name }} healthy.
Dropped records: {{
outputs.scan_fluentbit_metrics.vars.dropped_records_count }}, Output
retries: {{ outputs.scan_fluentbit_metrics.vars.output_retries_count
}}, Retry failures: {{
outputs.scan_fluentbit_metrics.vars.output_retry_failures_count }}."
- id: emit_audit_manifest
type: io.kestra.plugin.core.debug.Return
description: Emits structured audit manifest for logging infrastructure
reliability archives and compliance logs.
format: |
{
"flow_id": "{{ flow.id }}",
"pipeline_name": "{{ inputs.pipeline_name }}",
"dropped_records_count": {{ outputs.scan_fluentbit_metrics.vars.dropped_records_count }},
"output_retries_count": {{ outputs.scan_fluentbit_metrics.vars.output_retries_count }},
"output_retry_failures_count": {{ outputs.scan_fluentbit_metrics.vars.output_retry_failures_count }},
"buffer_mem_bytes": {{ outputs.scan_fluentbit_metrics.vars.buffer_mem_bytes }},
"buffer_mem_limit_pct": {{ outputs.scan_fluentbit_metrics.vars.buffer_mem_limit_pct }},
"is_alerting": {{ outputs.scan_fluentbit_metrics.vars.is_alerting }},
"audit_timestamp": "{{ outputs.scan_fluentbit_metrics.vars.audit_timestamp }}"
}
triggers:
- id: periodic_fluentbit_audit
type: io.kestra.plugin.core.trigger.Schedule
description: Executes automated Fluent Bit log pipeline health audit on a
recurring 15-minute schedule.
cron: "*/15 * * * *"