Skip to content

Commit c6542e6

Browse files
Yasmine92chaudum
andauthored
Promtail: Add ready endoint to loki-push-api server (#8552)
When trying to expose loki_push_api service (in our case using GKE ingress), we need a health check target endpoint that would return a 200 response code. This PR contains a simple addition for a HTTP handler that handles the /ready path, along with the necessary tests. Fixes #8551 Co-authored-by: Christian Haudum <[email protected]>
1 parent 0f0553f commit c6542e6

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

clients/pkg/promtail/targets/lokipush/pushtarget.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func (t *PushTarget) run() error {
8989
t.server = srv
9090
t.server.HTTP.Path("/loki/api/v1/push").Methods("POST").Handler(http.HandlerFunc(t.handleLoki))
9191
t.server.HTTP.Path("/promtail/api/v1/raw").Methods("POST").Handler(http.HandlerFunc(t.handlePlaintext))
92+
t.server.HTTP.Path("/ready").Methods("GET").Handler(http.HandlerFunc(t.ready))
9293

9394
go func() {
9495
err := srv.Run()
@@ -234,3 +235,11 @@ func (t *PushTarget) Stop() error {
234235
t.handler.Stop()
235236
return nil
236237
}
238+
239+
// ready function serves the ready endpoint
240+
func (t *PushTarget) ready(w http.ResponseWriter, r *http.Request) {
241+
resp := "ready"
242+
if _, err := w.Write([]byte(resp)); err != nil {
243+
level.Error(t.logger).Log("msg", "failed to respond to ready endoint", "err", err)
244+
}
245+
}

clients/pkg/promtail/targets/lokipush/pushtarget_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"flag"
66
"fmt"
7+
"io"
78
"net"
89
"net/http"
910
"os"
@@ -200,3 +201,67 @@ func TestPlaintextPushTarget(t *testing.T) {
200201
_ = pt.Stop()
201202

202203
}
204+
205+
func TestReady(t *testing.T) {
206+
w := log.NewSyncWriter(os.Stderr)
207+
logger := log.NewLogfmtLogger(w)
208+
209+
//Create PushTarget
210+
eh := fake.New(func() {})
211+
defer eh.Stop()
212+
213+
// Get a randomly available port by open and closing a TCP socket
214+
addr, err := net.ResolveTCPAddr("tcp", localhost+":0")
215+
require.NoError(t, err)
216+
l, err := net.ListenTCP("tcp", addr)
217+
require.NoError(t, err)
218+
port := l.Addr().(*net.TCPAddr).Port
219+
err = l.Close()
220+
require.NoError(t, err)
221+
222+
// Adjust some of the defaults
223+
defaults := server.Config{}
224+
defaults.RegisterFlags(flag.NewFlagSet("empty", flag.ContinueOnError))
225+
defaults.HTTPListenAddress = localhost
226+
defaults.HTTPListenPort = port
227+
defaults.GRPCListenAddress = localhost
228+
defaults.GRPCListenPort = 0 // Not testing GRPC, a random port will be assigned
229+
230+
config := &scrapeconfig.PushTargetConfig{
231+
Server: defaults,
232+
Labels: model.LabelSet{
233+
"pushserver": "pushserver2",
234+
"keepme": "label",
235+
},
236+
KeepTimestamp: true,
237+
}
238+
239+
pt, err := NewPushTarget(logger, eh, []*relabel.Config{}, "job3", config)
240+
require.NoError(t, err)
241+
242+
url := fmt.Sprintf("http://%s:%d/ready", localhost, port)
243+
response, err := http.Get(url)
244+
if err != nil {
245+
require.NoError(t, err)
246+
}
247+
body, err := io.ReadAll(response.Body)
248+
if err != nil {
249+
require.NoError(t, err)
250+
}
251+
responseCode := fmt.Sprint(response.StatusCode)
252+
responseBody := string(body)
253+
254+
fmt.Println(responseBody)
255+
wantedResponse := "ready"
256+
if responseBody != wantedResponse {
257+
t.Errorf("got the response %q, want %q", responseBody, wantedResponse)
258+
}
259+
wantedCode := "200"
260+
if responseCode != wantedCode {
261+
t.Errorf("Got the response code %q, want %q", responseCode, wantedCode)
262+
}
263+
264+
t.Cleanup(func() {
265+
_ = pt.Stop()
266+
})
267+
}

docs/sources/clients/promtail/configuration.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,8 @@ Note the `server` configuration is the same as [server](#server).
877877
Promtail also exposes a second endpoint on `/promtail/api/v1/raw` which expects newline-delimited log lines.
878878
This can be used to send NDJSON or plaintext logs.
879879

880+
The readiness of the loki_push_api server can be checked using the endpoint `/ready`.
881+
880882
```yaml
881883
# The push server configuration options
882884
[server: <server_config>]

0 commit comments

Comments
 (0)