Skip to content

Commit

Permalink
Return build info under /loki/api/v1/status/buildinfo. (#3972)
Browse files Browse the repository at this point in the history
* Return build info under `/version`.

Closes #3221

* Update documentation.

* Correct docs.

* Format version handler code.

* Ignore write error.

* Sort imports.

* Use `PrometheusVersion` struct.

* Set Go version.
  • Loading branch information
jeschkies authored Jul 9, 2021
1 parent 1cca922 commit af45204
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 3 deletions.
7 changes: 7 additions & 0 deletions docs/sources/api/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ These endpoints are exposed by all components:
- [`GET /ready`](#get-ready)
- [`GET /metrics`](#get-metrics)
- [`GET /config`](#get-config)
- [`GET /loki/api/v1/status/buildinfo`](#get-buildinfo)

These endpoints are exposed by the querier and the frontend:

Expand Down Expand Up @@ -823,6 +824,12 @@ and the current are returned. A value of `defaults` returns the default configur

In microservices mode, the `/config` endpoint is exposed by all components.

## `GET buildinfo`

`/loki/api/v1/status/buildinfo` exposes the build information in a JSON object. The fields are `version`, `revision`, `branch`, `buildDate`, `buildUser`, and `goVersion`.

In microservices mode, the `/version` endpoint is exposed by all components.

## Series

The Series API is available under the following:
Expand Down
5 changes: 4 additions & 1 deletion pkg/loki/loki.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,10 @@ func (t *Loki) Run() error {
t.Server.HTTP.Path("/ready").Handler(t.readyHandler(sm))

// This adds a way to see the config and the changes compared to the defaults
t.Server.HTTP.Path("/config").HandlerFunc(configHandler(t.Cfg, newDefaultConfig()))
t.Server.HTTP.Path("/loki/api/v1/status/buildinfo").HandlerFunc(configHandler(t.Cfg, newDefaultConfig()))

// Each component serves its version.
t.Server.HTTP.Path("/version").HandlerFunc(versionHandler())

t.Server.HTTP.Path("/debug/fgprof").Handler(fgprof.Handler())

Expand Down
31 changes: 31 additions & 0 deletions pkg/loki/version_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package loki

import (
"encoding/json"
"net/http"

prom "github.com/prometheus/prometheus/web/api/v1"

"github.com/grafana/loki/pkg/util/build"
)

func versionHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
info := prom.PrometheusVersion{
Version: build.Version,
Revision: build.Revision,
Branch: build.Branch,
BuildUser: build.BuildUser,
BuildDate: build.BuildDate,
GoVersion: build.GoVersion,
}

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)

// We ignore errors here, because we cannot do anything about them.
// Write will trigger sending Status code, so we cannot send a different status code afterwards.
// Also this isn't internal error, but error communicating with client.
_ = json.NewEncoder(w).Encode(info)
}
}
41 changes: 41 additions & 0 deletions pkg/loki/version_handler_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package loki

import (
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"

"github.com/stretchr/testify/assert"

"github.com/grafana/loki/pkg/util/build"
)

func TestVersionHandler(t *testing.T) {
build.Version = "0.0.1"
build.Branch = "main"
build.Revision = "foobar"
build.BuildDate = "yesterday"
build.BuildUser = "Turing"
build.GoVersion = "42"

req := httptest.NewRequest("GET", "http://test.com/config?mode=diff", nil)
w := httptest.NewRecorder()

h := versionHandler()
h(w, req)
resp := w.Result()
assert.Equal(t, http.StatusOK, resp.StatusCode)

expected := `{
"version":"0.0.1",
"branch":"main",
"buildDate":"yesterday",
"buildUser":"Turing",
"revision":"foobar",
"goVersion": "42"
}`
body, err := ioutil.ReadAll(resp.Body)
assert.NoError(t, err)
assert.JSONEq(t, expected, string(body))
}
2 changes: 1 addition & 1 deletion pkg/querier/queryrange/roundtrip.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ func NewLogFilterTripperware(
}, nil
}

// NewSeriesripperware creates a new frontend tripperware responsible for handling series requests
// NewSeriesTripperware creates a new frontend tripperware responsible for handling series requests
func NewSeriesTripperware(
cfg Config,
log log.Logger,
Expand Down
8 changes: 7 additions & 1 deletion pkg/util/build/build.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package build

import "github.com/prometheus/common/version"
import (
"runtime"

"github.com/prometheus/common/version"
)

// Version information passed to Prometheus version package.
// Package path as used by linker changes based on vendoring being used or not,
Expand All @@ -12,6 +16,7 @@ var (
Branch string
BuildUser string
BuildDate string
GoVersion string
)

func init() {
Expand All @@ -20,4 +25,5 @@ func init() {
version.Branch = Branch
version.BuildUser = BuildUser
version.BuildDate = BuildDate
version.GoVersion = runtime.Version()
}

0 comments on commit af45204

Please sign in to comment.