Skip to content

Commit

Permalink
[BUG] do not output error message for connections closed due to timeo…
Browse files Browse the repository at this point in the history
…ut (#241)

* do not output error log for connection closed
  • Loading branch information
khushijain21 authored Nov 14, 2024
1 parent 5ba501c commit f3ef8be
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
2 changes: 1 addition & 1 deletion transport/logging.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func LoggingDialer(d Dialer, logger *logp.Logger) Dialer {

func (l *loggingConn) Read(b []byte) (int, error) {
n, err := l.Conn.Read(b)
if err != nil && !errors.Is(err, io.EOF) {
if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) {
l.logger.Debugf("Error reading from connection: %v", err)
}
return n, err
Expand Down
76 changes: 76 additions & 0 deletions transport/logging_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package transport

import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"testing"
"time"

"github.com/elastic/elastic-agent-libs/logp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestCloseConnectionError(t *testing.T) {
// observe all logs
if err := logp.DevelopmentSetup(logp.ToObserverOutput()); err != nil {
t.Fatalf("cannot initialise logger on development mode: %+v", err)
}

// Set up a test HTTP server
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, `{"status": "ok"}`)
}))
defer server.Close()

logger := logp.NewLogger("test")
// Set IdleConnTimeout to 2 seconds and a custom dialer
transport := &http.Transport{
IdleConnTimeout: 2 * time.Second,
// uses our implementation of custom dialer
DialContext: LoggingDialer(NetDialer(10*time.Second), logger).DialContext,
}

client := &http.Client{
Transport: transport,
}

// First request to the test server
resp, err := client.Get(server.URL) //nolint:noctx // It is a test
require.NoError(t, err, "first request failed")
_, _ = io.ReadAll(resp.Body)
resp.Body.Close()

// Wait for a duration longer than IdleConnTimeout
waitTime := 6 * time.Second
time.Sleep(waitTime)

// Second request to the test server after idle timeout
resp, err = client.Get(server.URL) //nolint:noctx // It is a test
require.NoError(t, err, "second request failed")
_, _ = io.ReadAll(resp.Body)
resp.Body.Close()

logs := logp.ObserverLogs().FilterMessageSnippet("Error reading from connection:").TakeAll()
assert.Equal(t, 0, len(logs), "did not ignore use of closed connection error")

}

0 comments on commit f3ef8be

Please sign in to comment.