From 393d1b8b3a09572af533e247590e44d10b0be47a Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Mon, 7 Aug 2023 22:41:24 +0200 Subject: [PATCH] feat(inputs.jti_openconfig_telemetry): Add keep-alive setting (#13709) --- .../inputs/jti_openconfig_telemetry/README.md | 4 ++++ .../jti_openconfig_telemetry.go | 21 +++++++++++++++++-- .../jti_openconfig_telemetry/sample.conf | 4 ++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/plugins/inputs/jti_openconfig_telemetry/README.md b/plugins/inputs/jti_openconfig_telemetry/README.md index cf0d69aeb..3a8a119f9 100644 --- a/plugins/inputs/jti_openconfig_telemetry/README.md +++ b/plugins/inputs/jti_openconfig_telemetry/README.md @@ -84,6 +84,10 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details. ## Failed streams/calls will not be retried if 0 is provided retry_delay = "1000ms" + ## Period for sending keep-alive packets on idle connections + ## This is helpful to identify broken connections to the server + # keep_alive_period = "10s" + ## To treat all string values as tags, set this to true str_as_tags = false ``` diff --git a/plugins/inputs/jti_openconfig_telemetry/jti_openconfig_telemetry.go b/plugins/inputs/jti_openconfig_telemetry/jti_openconfig_telemetry.go index e8337d563..af651ee70 100644 --- a/plugins/inputs/jti_openconfig_telemetry/jti_openconfig_telemetry.go +++ b/plugins/inputs/jti_openconfig_telemetry/jti_openconfig_telemetry.go @@ -15,6 +15,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" @@ -40,6 +41,7 @@ type OpenConfigTelemetry struct { StrAsTags bool `toml:"str_as_tags"` RetryDelay config.Duration `toml:"retry_delay"` EnableTLS bool `toml:"enable_tls"` + KeepAlivePeriod config.Duration `toml:"keep_alive_period"` internaltls.ClientConfig Log telegraf.Logger @@ -380,7 +382,21 @@ func (m *OpenConfigTelemetry) Start(acc telegraf.Accumulator) error { } else { creds = insecure.NewCredentials() } - opt := grpc.WithTransportCredentials(creds) + + // Setup the basic connection options + options := []grpc.DialOption{ + grpc.WithTransportCredentials(creds), + grpc.WithBlock(), + } + + // Add keep-alive settings + if m.KeepAlivePeriod > 0 { + params := keepalive.ClientParameters{ + Time: time.Duration(m.KeepAlivePeriod), + Timeout: 2 * time.Duration(m.KeepAlivePeriod), + } + options = append(options, grpc.WithKeepaliveParams(params)) + } // Connect to given list of servers and start collecting data var grpcClientConn *grpc.ClientConn @@ -406,7 +422,7 @@ func (m *OpenConfigTelemetry) Start(acc telegraf.Accumulator) error { continue } - grpcClientConn, err = grpc.DialContext(ctx, server, opt) + grpcClientConn, err = grpc.DialContext(ctx, server, options...) if err != nil { m.Log.Errorf("Failed to connect to %s: %s", server, err.Error()) } else { @@ -438,6 +454,7 @@ func init() { inputs.Add("jti_openconfig_telemetry", func() telegraf.Input { return &OpenConfigTelemetry{ RetryDelay: config.Duration(time.Second), + KeepAlivePeriod: config.Duration(10 * time.Second), StrAsTags: false, TimestampSource: "collection", } diff --git a/plugins/inputs/jti_openconfig_telemetry/sample.conf b/plugins/inputs/jti_openconfig_telemetry/sample.conf index c2ae9da12..b82d75228 100644 --- a/plugins/inputs/jti_openconfig_telemetry/sample.conf +++ b/plugins/inputs/jti_openconfig_telemetry/sample.conf @@ -52,5 +52,9 @@ ## Failed streams/calls will not be retried if 0 is provided retry_delay = "1000ms" + ## Period for sending keep-alive packets on idle connections + ## This is helpful to identify broken connections to the server + # keep_alive_period = "10s" + ## To treat all string values as tags, set this to true str_as_tags = false