diff --git a/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h b/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h index 8b21d82a7..0e8a4c188 100644 --- a/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h +++ b/exporters/fluentd/include/opentelemetry/exporters/fluentd/common/fluentd_common.h @@ -230,6 +230,7 @@ struct FluentdExporterOptions { TransportFormat format = TransportFormat::kForward; std::string tag = "tag.service"; size_t retry_count = 2; // number of retries before drop + uint32_t retry_delay_ms = 1000; std::string endpoint; bool convert_event_to_trace = false; // convert events to trace. Not used for Logs. diff --git a/exporters/fluentd/src/log/fluentd_exporter.cc b/exporters/fluentd/src/log/fluentd_exporter.cc index ea6e05f7f..9bddfe5e9 100644 --- a/exporters/fluentd/src/log/fluentd_exporter.cc +++ b/exporters/fluentd/src/log/fluentd_exporter.cc @@ -124,6 +124,7 @@ sdk::common::ExportResult FluentdExporter::Export( */ bool FluentdExporter::Send(std::vector &packet) { size_t retryCount = options_.retry_count; + auto retrySleepMs = std::chrono::milliseconds(options_.retry_delay_ms); while (retryCount--) { int error_code = 0; // Check if socket is Okay @@ -135,8 +136,12 @@ bool FluentdExporter::Send(std::vector &packet) { } // Reconnect if not Okay if (!connected_) { + Initialize(); // try a DNS lookup, etc // Establishing socket connection may take time if (!Connect()) { + if (retryCount) { + std::this_thread::sleep_for(retrySleepMs); + } continue; } LOG_DEBUG("socket connected"); @@ -152,10 +157,15 @@ bool FluentdExporter::Send(std::vector &packet) { } LOG_WARN("send failed, retrying %lu ...", retryCount); + Disconnect(); // Retry to connect and/or send + if (retryCount) { + std::this_thread::sleep_for(retrySleepMs); + } } LOG_ERROR("send failed!"); + Disconnect(); return false; } diff --git a/exporters/fluentd/src/trace/fluentd_exporter.cc b/exporters/fluentd/src/trace/fluentd_exporter.cc index c6119a16e..df75fc8a6 100644 --- a/exporters/fluentd/src/trace/fluentd_exporter.cc +++ b/exporters/fluentd/src/trace/fluentd_exporter.cc @@ -227,6 +227,7 @@ bool FluentdExporter::Connect() { */ bool FluentdExporter::Send(std::vector &packet) { size_t retryCount = options_.retry_count; + auto retrySleepMs = std::chrono::milliseconds(options_.retry_delay_ms); while (retryCount--) { int error_code = 0; // Check if socket is Okay @@ -238,8 +239,12 @@ bool FluentdExporter::Send(std::vector &packet) { } // Reconnect if not Okay if (!connected_) { + Initialize(); // try a DNS lookup, etc // Establishing socket connection may take time if (!Connect()) { + if (retryCount) { + std::this_thread::sleep_for(retrySleepMs); + } continue; } LOG_DEBUG("socket connected"); @@ -255,10 +260,15 @@ bool FluentdExporter::Send(std::vector &packet) { } LOG_WARN("send failed, retrying %u ...", (unsigned int)retryCount); + Disconnect(); // Retry to connect and/or send + if (retryCount) { + std::this_thread::sleep_for(retrySleepMs); + } } LOG_ERROR("send failed!"); + Disconnect(); return false; }