Return build info under `/loki/api/v1/status/buildinfo`. (#3972)

* 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.
pull/3981/head
Karsten Jeschkies 4 years ago committed by GitHub
parent 1cca922e6d
commit af452047d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      docs/sources/api/_index.md
  2. 5
      pkg/loki/loki.go
  3. 31
      pkg/loki/version_handler.go
  4. 41
      pkg/loki/version_handler_test.go
  5. 2
      pkg/querier/queryrange/roundtrip.go
  6. 8
      pkg/util/build/build.go

@ -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:
@ -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:

@ -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())

@ -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)
}
}

@ -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))
}

@ -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,

@ -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,
@ -12,6 +16,7 @@ var (
Branch string
BuildUser string
BuildDate string
GoVersion string
)
func init() {
@ -20,4 +25,5 @@ func init() {
version.Branch = Branch
version.BuildUser = BuildUser
version.BuildDate = BuildDate
version.GoVersion = runtime.Version()
}

Loading…
Cancel
Save