|
@@ -5,6 +5,7 @@ package splunk
|
|
import (
|
|
import (
|
|
"bytes"
|
|
"bytes"
|
|
"compress/gzip"
|
|
"compress/gzip"
|
|
|
|
+ "context"
|
|
"crypto/tls"
|
|
"crypto/tls"
|
|
"crypto/x509"
|
|
"crypto/x509"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
@@ -63,6 +64,8 @@ const (
|
|
envVarStreamChannelSize = "SPLUNK_LOGGING_DRIVER_CHANNEL_SIZE"
|
|
envVarStreamChannelSize = "SPLUNK_LOGGING_DRIVER_CHANNEL_SIZE"
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+var batchSendTimeout = 30 * time.Second
|
|
|
|
+
|
|
type splunkLoggerInterface interface {
|
|
type splunkLoggerInterface interface {
|
|
logger.Logger
|
|
logger.Logger
|
|
worker()
|
|
worker()
|
|
@@ -416,13 +419,18 @@ func (l *splunkLogger) worker() {
|
|
|
|
|
|
func (l *splunkLogger) postMessages(messages []*splunkMessage, lastChance bool) []*splunkMessage {
|
|
func (l *splunkLogger) postMessages(messages []*splunkMessage, lastChance bool) []*splunkMessage {
|
|
messagesLen := len(messages)
|
|
messagesLen := len(messages)
|
|
|
|
+
|
|
|
|
+ ctx, cancel := context.WithTimeout(context.Background(), batchSendTimeout)
|
|
|
|
+ defer cancel()
|
|
|
|
+
|
|
for i := 0; i < messagesLen; i += l.postMessagesBatchSize {
|
|
for i := 0; i < messagesLen; i += l.postMessagesBatchSize {
|
|
upperBound := i + l.postMessagesBatchSize
|
|
upperBound := i + l.postMessagesBatchSize
|
|
if upperBound > messagesLen {
|
|
if upperBound > messagesLen {
|
|
upperBound = messagesLen
|
|
upperBound = messagesLen
|
|
}
|
|
}
|
|
- if err := l.tryPostMessages(messages[i:upperBound]); err != nil {
|
|
|
|
- logrus.Error(err)
|
|
|
|
|
|
+
|
|
|
|
+ if err := l.tryPostMessages(ctx, messages[i:upperBound]); err != nil {
|
|
|
|
+ logrus.WithError(err).WithField("module", "logger/splunk").Warn("Error while sending logs")
|
|
if messagesLen-i >= l.bufferMaximum || lastChance {
|
|
if messagesLen-i >= l.bufferMaximum || lastChance {
|
|
// If this is last chance - print them all to the daemon log
|
|
// If this is last chance - print them all to the daemon log
|
|
if lastChance {
|
|
if lastChance {
|
|
@@ -447,7 +455,7 @@ func (l *splunkLogger) postMessages(messages []*splunkMessage, lastChance bool)
|
|
return messages[:0]
|
|
return messages[:0]
|
|
}
|
|
}
|
|
|
|
|
|
-func (l *splunkLogger) tryPostMessages(messages []*splunkMessage) error {
|
|
|
|
|
|
+func (l *splunkLogger) tryPostMessages(ctx context.Context, messages []*splunkMessage) error {
|
|
if len(messages) == 0 {
|
|
if len(messages) == 0 {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
@@ -486,6 +494,7 @@ func (l *splunkLogger) tryPostMessages(messages []*splunkMessage) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ req = req.WithContext(ctx)
|
|
req.Header.Set("Authorization", l.auth)
|
|
req.Header.Set("Authorization", l.auth)
|
|
// Tell if we are sending gzip compressed body
|
|
// Tell if we are sending gzip compressed body
|
|
if l.gzipCompression {
|
|
if l.gzipCompression {
|