diff --git a/ADOPTERS.md b/ADOPTERS.md
index de6440bc7e69..52621c48a34d 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -7,3 +7,4 @@
* [Heureka Group](https://heureka.group)
* [Norwegian Refugee Council](https://www.nrc.no/)
* [Dropbox](https://www.dropbox.com/)
+* [ASML](https://www.asml.com/)
\ No newline at end of file
diff --git a/clients/cmd/promtail/Dockerfile b/clients/cmd/promtail/Dockerfile
index bb951765411a..c18b96ddcc54 100644
--- a/clients/cmd/promtail/Dockerfile
+++ b/clients/cmd/promtail/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9-bookworm as build
+FROM golang:1.22.2-bookworm as build
COPY . /src/loki
WORKDIR /src/loki
@@ -9,7 +9,7 @@ RUN make clean && make BUILD_IN_CONTAINER=false PROMTAIL_JOURNAL_ENABLED=true pr
FROM debian:12.5-slim
# tzdata required for the timestamp stage to work
RUN apt-get update && \
- apt-get install -qy tzdata ca-certificates libsystemd-dev && \
+ apt-get install -qy tzdata ca-certificates wget libsystemd-dev && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY --from=build /src/loki/clients/cmd/promtail/promtail /usr/bin/promtail
COPY clients/cmd/promtail/promtail-docker-config.yaml /etc/promtail/config.yml
diff --git a/clients/cmd/promtail/Dockerfile.arm32 b/clients/cmd/promtail/Dockerfile.arm32
index bb0019332b23..8724b1ff58b7 100644
--- a/clients/cmd/promtail/Dockerfile.arm32
+++ b/clients/cmd/promtail/Dockerfile.arm32
@@ -1,4 +1,4 @@
-FROM golang:1.21.9-bookworm as build
+FROM golang:1.22.2-bookworm as build
COPY . /src/loki
WORKDIR /src/loki
@@ -9,7 +9,7 @@ RUN make clean && make BUILD_IN_CONTAINER=false PROMTAIL_JOURNAL_ENABLED=true pr
FROM debian:12.5-slim
# tzdata required for the timestamp stage to work
RUN apt-get update && \
- apt-get install -qy tzdata ca-certificates libsystemd-dev && \
+ apt-get install -qy tzdata ca-certificates wget libsystemd-dev && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY --from=build /src/loki/clients/cmd/promtail/promtail /usr/bin/promtail
COPY clients/cmd/promtail/promtail-local-config.yaml /etc/promtail/local-config.yaml
diff --git a/clients/cmd/promtail/Dockerfile.cross b/clients/cmd/promtail/Dockerfile.cross
index c19c7f4d3f49..0968b99ea3fd 100644
--- a/clients/cmd/promtail/Dockerfile.cross
+++ b/clients/cmd/promtail/Dockerfile.cross
@@ -2,7 +2,7 @@ ARG BUILD_IMAGE=grafana/loki-build-image:0.33.1
# Directories in this file are referenced from the root of the project not this folder
# This file is intended to be called from the root like so:
# docker build -t grafana/promtail -f clients/cmd/promtail/Dockerfile .
-FROM golang:1.21.9-alpine as goenv
+FROM 1.22.2-alpine as goenv
RUN go env GOARCH > /goarch && \
go env GOARM > /goarm
@@ -16,7 +16,7 @@ RUN make clean && GOARCH=$(cat /goarch) GOARM=$(cat /goarm) make BUILD_IN_CONTAI
FROM debian:12.5-slim
# tzdata required for the timestamp stage to work
RUN apt-get update && \
- apt-get install -qy tzdata ca-certificates libsystemd-dev && \
+ apt-get install -qy tzdata ca-certificates wget libsystemd-dev && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY --from=build /src/loki/clients/cmd/promtail/promtail /usr/bin/promtail
COPY clients/cmd/promtail/promtail-local-config.yaml /etc/promtail/local-config.yaml
diff --git a/cmd/logcli/Dockerfile b/cmd/logcli/Dockerfile
index a0c8e3a67cd2..9eaf3dda8fc7 100644
--- a/cmd/logcli/Dockerfile
+++ b/cmd/logcli/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
diff --git a/cmd/logql-analyzer/Dockerfile b/cmd/logql-analyzer/Dockerfile
index 1413a33e6249..abfbbe0c8851 100644
--- a/cmd/logql-analyzer/Dockerfile
+++ b/cmd/logql-analyzer/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
diff --git a/cmd/loki-canary-boringcrypto/Dockerfile b/cmd/loki-canary-boringcrypto/Dockerfile
index 481450664180..932f70b50013 100644
--- a/cmd/loki-canary-boringcrypto/Dockerfile
+++ b/cmd/loki-canary-boringcrypto/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
diff --git a/cmd/loki-canary/Dockerfile b/cmd/loki-canary/Dockerfile
index ec8889df25a5..930c0f3bb161 100644
--- a/cmd/loki-canary/Dockerfile
+++ b/cmd/loki-canary/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
diff --git a/cmd/loki-canary/Dockerfile.cross b/cmd/loki-canary/Dockerfile.cross
index 60a5ff732f38..c137e65cce02 100644
--- a/cmd/loki-canary/Dockerfile.cross
+++ b/cmd/loki-canary/Dockerfile.cross
@@ -2,7 +2,7 @@ ARG BUILD_IMAGE=grafana/loki-build-image:0.33.1
# Directories in this file are referenced from the root of the project not this folder
# This file is intended to be called from the root like so:
# docker build -t grafana/promtail -f cmd/promtail/Dockerfile .
-FROM golang:1.21.9-alpine as goenv
+FROM golang:1.22.2-alpine as goenv
RUN go env GOARCH > /goarch && \
go env GOARM > /goarm
diff --git a/cmd/loki/Dockerfile b/cmd/loki/Dockerfile
index 55c80ef61216..ed85213b0d2f 100644
--- a/cmd/loki/Dockerfile
+++ b/cmd/loki/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
diff --git a/cmd/loki/Dockerfile.cross b/cmd/loki/Dockerfile.cross
index 833f9b266ba1..fcc475f6e77d 100644
--- a/cmd/loki/Dockerfile.cross
+++ b/cmd/loki/Dockerfile.cross
@@ -2,7 +2,7 @@ ARG BUILD_IMAGE=grafana/loki-build-image:0.33.1
# Directories in this file are referenced from the root of the project not this folder
# This file is intended to be called from the root like so:
# docker build -t grafana/loki -f cmd/loki/Dockerfile .
-FROM golang:1.21.9-alpine as goenv
+FROM golang:1.22.2-alpine as goenv
RUN go env GOARCH > /goarch && \
go env GOARM > /goarm
diff --git a/cmd/loki/Dockerfile.debug b/cmd/loki/Dockerfile.debug
index 9b1f427a696e..def64b370b57 100644
--- a/cmd/loki/Dockerfile.debug
+++ b/cmd/loki/Dockerfile.debug
@@ -3,7 +3,7 @@ ARG BUILD_IMAGE=grafana/loki-build-image:0.33.1
# This file is intended to be called from the root like so:
# docker build -t grafana/loki -f cmd/loki/Dockerfile.debug .
-FROM golang:1.21.9-alpine as goenv
+FROM golang:1.22.2-alpine as goenv
RUN go env GOARCH > /goarch && \
go env GOARM > /goarm && \
go install github.com/go-delve/delve/cmd/dlv@latest
diff --git a/cmd/migrate/Dockerfile b/cmd/migrate/Dockerfile
index f83c26bf893d..91861fa718ff 100644
--- a/cmd/migrate/Dockerfile
+++ b/cmd/migrate/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
RUN make clean && make BUILD_IN_CONTAINER=false migrate
diff --git a/cmd/querytee/Dockerfile b/cmd/querytee/Dockerfile
index c32752b0604f..77be07225f5e 100644
--- a/cmd/querytee/Dockerfile
+++ b/cmd/querytee/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2 as build
COPY . /src/loki
WORKDIR /src/loki
diff --git a/cmd/querytee/Dockerfile.cross b/cmd/querytee/Dockerfile.cross
index 5f84f9ab410d..05d63ee55325 100644
--- a/cmd/querytee/Dockerfile.cross
+++ b/cmd/querytee/Dockerfile.cross
@@ -2,7 +2,7 @@ ARG BUILD_IMAGE=grafana/loki-build-image:0.33.1
# Directories in this file are referenced from the root of the project not this folder
# This file is intended to be called from the root like so:
# docker build -t grafana/promtail -f cmd/promtail/Dockerfile .
-FROM golang:1.21.9-alpine as goenv
+FROM golang:1.22.2-alpine as goenv
RUN go env GOARCH > /goarch && \
go env GOARM > /goarm
diff --git a/docs/sources/setup/install/helm/reference.md b/docs/sources/setup/install/helm/reference.md
index 9d3e04fe9d8e..529bf63b7570 100644
--- a/docs/sources/setup/install/helm/reference.md
+++ b/docs/sources/setup/install/helm/reference.md
@@ -2630,7 +2630,7 @@ null
"tolerations": []
},
"useExternalLicense": false,
- "version": "v1.8.6"
+ "version": "v3.0.0"
}
@@ -3457,7 +3457,7 @@ null
string |
Uses the specified users from the `loki.tenants` list to create the htpasswd file if `loki.tenants` is not set, the `gateway.basicAuth.username` and `gateway.basicAuth.password` are used The value is templated using `tpl`. Override this to use a custom htpasswd, e.g. in case the default causes high CPU load. |
-"{{ if .Values.loki.tenants }}\n\n {{- range $t := .Values.loki.tenants }}\n{{ htpasswd (required \"All tenants must have a 'name' set\" $t.name) (required \"All tenants must have a 'password' set\" $t.password) }}\n\n {{- end }}\n{{ else }} {{ htpasswd (required \"'gateway.basicAuth.username' is required\" .Values.gateway.basicAuth.username) (required \"'gateway.basicAuth.password' is required\" .Values.gateway.basicAuth.password) }} {{ end }}"
+"{{ if .Values.loki.tenants }}\n\n\n {{- range $t := .Values.loki.tenants }}\n{{ htpasswd (required \"All tenants must have a 'name' set\" $t.name) (required \"All tenants must have a 'password' set\" $t.password) }}\n\n\n {{- end }}\n{{ else }} {{ htpasswd (required \"'gateway.basicAuth.username' is required\" .Values.gateway.basicAuth.username) (required \"'gateway.basicAuth.password' is required\" .Values.gateway.basicAuth.password) }} {{ end }}"
|
@@ -6420,6 +6420,7 @@ false
},
"tenant": {
"name": "self-monitoring",
+ "password": null,
"secretNamespace": "{{ .Release.Namespace }}"
}
},
@@ -6697,6 +6698,7 @@ null
{
"name": "self-monitoring",
+ "password": null,
"secretNamespace": "{{ .Release.Namespace }}"
}
@@ -6709,6 +6711,15 @@ null
|
"self-monitoring"
+ |
+
+
+ monitoring.selfMonitoring.tenant.password |
+ string |
+ Password of the gateway for Basic auth |
+
+null
+
|
diff --git a/integration/client/client.go b/integration/client/client.go
index 6e9e861ad970..e04e6715606a 100644
--- a/integration/client/client.go
+++ b/integration/client/client.go
@@ -111,7 +111,7 @@ func (c *Client) PushOTLPLogLine(line string, timestamp time.Time, logAttributes
return c.pushOTLPLogLine(line, timestamp, logAttributes)
}
-func formatTS(ts time.Time) string {
+func FormatTS(ts time.Time) string {
return strconv.FormatInt(ts.UnixNano(), 10)
}
@@ -130,7 +130,7 @@ func (c *Client) pushLogLine(line string, timestamp time.Time, structuredMetadat
},
Values: [][]any{
{
- formatTS(timestamp),
+ FormatTS(timestamp),
line,
structuredMetadata,
},
@@ -509,7 +509,7 @@ func (c *Client) RunQuery(ctx context.Context, query string, extraHeaders ...Hea
v := url.Values{}
v.Set("query", query)
- v.Set("time", formatTS(c.Now.Add(time.Second)))
+ v.Set("time", FormatTS(c.Now.Add(time.Second)))
u, err := url.Parse(c.baseURL)
if err != nil {
@@ -568,8 +568,8 @@ func (c *Client) parseResponse(buf []byte, statusCode int) (*Response, error) {
func (c *Client) rangeQueryURL(query string, start, end time.Time) string {
v := url.Values{}
v.Set("query", query)
- v.Set("start", formatTS(start))
- v.Set("end", formatTS(end))
+ v.Set("start", FormatTS(start))
+ v.Set("end", FormatTS(end))
u, err := url.Parse(c.baseURL)
if err != nil {
diff --git a/integration/explore_logs_test.go b/integration/explore_logs_test.go
new file mode 100644
index 000000000000..c902efd8781e
--- /dev/null
+++ b/integration/explore_logs_test.go
@@ -0,0 +1,223 @@
+//go:build integration
+
+package integration
+
+import (
+ "context"
+ "encoding/json"
+ "io"
+ "net/url"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/grafana/loki/v3/integration/client"
+ "github.com/grafana/loki/v3/integration/cluster"
+)
+
+type DetectedField struct {
+ Label string `json:"label"`
+ Type string `json:"type"`
+ Cardinality uint64 `json:"cardinality"`
+}
+
+type DetectedFields []DetectedField
+type DetectedFieldResponse struct {
+ Fields DetectedFields `json:"fields"`
+}
+
+func Test_ExploreLogsApis(t *testing.T) {
+ clu := cluster.New(nil, cluster.SchemaWithTSDBAndTSDB, func(c *cluster.Cluster) {
+ c.SetSchemaVer("v13")
+ })
+ defer func() {
+ assert.NoError(t, clu.Cleanup())
+ }()
+
+ // run initially the compactor, indexgateway, and distributor.
+ var (
+ tCompactor = clu.AddComponent(
+ "compactor",
+ "-target=compactor",
+ "-compactor.compaction-interval=1s",
+ "-compactor.retention-delete-delay=1s",
+ // By default, a minute is added to the delete request start time. This compensates for that.
+ "-compactor.delete-request-cancel-period=-60s",
+ "-compactor.deletion-mode=filter-and-delete",
+ )
+ tIndexGateway = clu.AddComponent(
+ "index-gateway",
+ "-target=index-gateway",
+ )
+ tDistributor = clu.AddComponent(
+ "distributor",
+ "-target=distributor",
+ )
+ )
+ require.NoError(t, clu.Run())
+
+ // then, run only the ingester and query scheduler.
+ var (
+ tIngester = clu.AddComponent(
+ "ingester",
+ "-target=ingester",
+ "-boltdb.shipper.index-gateway-client.server-address="+tIndexGateway.GRPCURL(),
+ )
+ tQueryScheduler = clu.AddComponent(
+ "query-scheduler",
+ "-target=query-scheduler",
+ "-query-scheduler.use-scheduler-ring=false",
+ "-boltdb.shipper.index-gateway-client.server-address="+tIndexGateway.GRPCURL(),
+ )
+ )
+ require.NoError(t, clu.Run())
+
+ // the run querier.
+ var (
+ tQuerier = clu.AddComponent(
+ "querier",
+ "-target=querier",
+ "-querier.scheduler-address="+tQueryScheduler.GRPCURL(),
+ "-boltdb.shipper.index-gateway-client.server-address="+tIndexGateway.GRPCURL(),
+ "-common.compactor-address="+tCompactor.HTTPURL(),
+ )
+ )
+ require.NoError(t, clu.Run())
+
+ // finally, run the query-frontend.
+ var (
+ tQueryFrontend = clu.AddComponent(
+ "query-frontend",
+ "-target=query-frontend",
+ "-frontend.scheduler-address="+tQueryScheduler.GRPCURL(),
+ "-boltdb.shipper.index-gateway-client.server-address="+tIndexGateway.GRPCURL(),
+ "-common.compactor-address="+tCompactor.HTTPURL(),
+ "-querier.per-request-limits-enabled=true",
+ "-frontend.encoding=protobuf",
+ "-querier.shard-aggregations=quantile_over_time",
+ "-frontend.tail-proxy-url="+tQuerier.HTTPURL(),
+ )
+ )
+ require.NoError(t, clu.Run())
+
+ tenantID := randStringRunes()
+
+ now := time.Now()
+ cliDistributor := client.New(tenantID, "", tDistributor.HTTPURL())
+ cliDistributor.Now = now
+ cliIngester := client.New(tenantID, "", tIngester.HTTPURL())
+ cliIngester.Now = now
+ cliQueryFrontend := client.New(tenantID, "", tQueryFrontend.HTTPURL())
+ cliQueryFrontend.Now = now
+
+ t.Run("/detected_fields", func(t *testing.T) {
+ // ingest some log lines
+ require.NoError(t, cliDistributor.PushLogLine("foo=bar color=red", now.Add(-45*time.Minute), nil, map[string]string{"job": "fake"}))
+ require.NoError(t, cliDistributor.PushLogLine("foo=bar color=blue", now.Add(-45*time.Minute), nil, map[string]string{"job": "fake"}))
+
+ require.NoError(t, cliDistributor.PushLogLine("foo=bar color=red", now.Add(-5*time.Second), nil, map[string]string{"job": "fake"}))
+ require.NoError(t, cliDistributor.PushLogLine("foo=bar color=purple", now.Add(-5*time.Second), nil, map[string]string{"job": "fake"}))
+
+ require.NoError(t, cliDistributor.PushLogLine("foo=bar color=green", now, nil, map[string]string{"job": "fake"}))
+ require.NoError(t, cliDistributor.PushLogLine("foo=bar color=red", now, nil, map[string]string{"job": "fake"}))
+
+ // validate logs are there
+ resp, err := cliQueryFrontend.RunRangeQuery(context.Background(), `{job="fake"}`)
+ require.NoError(t, err)
+ assert.Equal(t, "streams", resp.Data.ResultType)
+
+ var lines []string
+ for _, stream := range resp.Data.Stream {
+ for _, val := range stream.Values {
+ lines = append(lines, val[1])
+ }
+ }
+ assert.ElementsMatch(t, []string{"foo=bar color=red", "foo=bar color=blue", "foo=bar color=red", "foo=bar color=purple", "foo=bar color=green", "foo=bar color=red"}, lines)
+
+ t.Run("non-split queries", func(t *testing.T) {
+ start := cliQueryFrontend.Now.Add(-1 * time.Minute)
+ end := cliQueryFrontend.Now.Add(time.Minute)
+
+ v := url.Values{}
+ v.Set("query", `{job="fake"}`)
+ v.Set("start", client.FormatTS(start))
+ v.Set("end", client.FormatTS(end))
+
+ u := url.URL{}
+ u.Path = "/loki/api/v1/detected_fields"
+ u.RawQuery = v.Encode()
+ dfResp, err := cliQueryFrontend.Get(u.String())
+ require.NoError(t, err)
+ defer dfResp.Body.Close()
+
+ buf, err := io.ReadAll(dfResp.Body)
+ require.NoError(t, err)
+
+ var detectedFieldResponse DetectedFieldResponse
+ err = json.Unmarshal(buf, &detectedFieldResponse)
+ require.NoError(t, err)
+
+ require.Equal(t, 2, len(detectedFieldResponse.Fields))
+
+ var fooField, colorField DetectedField
+ for _, field := range detectedFieldResponse.Fields {
+ if field.Label == "foo" {
+ fooField = field
+ }
+
+ if field.Label == "color" {
+ colorField = field
+ }
+ }
+
+ require.Equal(t, "string", fooField.Type)
+ require.Equal(t, "string", colorField.Type)
+ require.Equal(t, uint64(1), fooField.Cardinality)
+ require.Equal(t, uint64(3), colorField.Cardinality)
+ })
+
+ t.Run("split queries", func(t *testing.T) {
+ start := cliQueryFrontend.Now.Add(-24 * time.Hour)
+ end := cliQueryFrontend.Now.Add(time.Minute)
+
+ v := url.Values{}
+ v.Set("query", `{job="fake"}`)
+ v.Set("start", client.FormatTS(start))
+ v.Set("end", client.FormatTS(end))
+
+ u := url.URL{}
+ u.Path = "/loki/api/v1/detected_fields"
+ u.RawQuery = v.Encode()
+ dfResp, err := cliQueryFrontend.Get(u.String())
+ require.NoError(t, err)
+ defer dfResp.Body.Close()
+
+ buf, err := io.ReadAll(dfResp.Body)
+ require.NoError(t, err)
+
+ var detectedFieldResponse DetectedFieldResponse
+ err = json.Unmarshal(buf, &detectedFieldResponse)
+ require.NoError(t, err)
+
+ require.Equal(t, 2, len(detectedFieldResponse.Fields))
+
+ var fooField, colorField DetectedField
+ for _, field := range detectedFieldResponse.Fields {
+ if field.Label == "foo" {
+ fooField = field
+ }
+
+ if field.Label == "color" {
+ colorField = field
+ }
+ }
+
+ require.Equal(t, "string", fooField.Type)
+ require.Equal(t, "string", colorField.Type)
+ require.Equal(t, uint64(1), fooField.Cardinality)
+ require.Equal(t, uint64(4), colorField.Cardinality)
+ })
+ })
+}
diff --git a/loki-build-image/Dockerfile b/loki-build-image/Dockerfile
index 097bdd205fe7..beb7b0078dae 100644
--- a/loki-build-image/Dockerfile
+++ b/loki-build-image/Dockerfile
@@ -6,7 +6,7 @@
# on how to publish a new build image.
# Install helm (https://helm.sh/) and helm-docs (https://github.com/norwoodj/helm-docs) for generating Helm Chart reference.
-FROM golang:1.21.9-bullseye as helm
+FROM golang:1.22.2-bookworm as helm
ARG TARGETARCH
ARG HELM_VER="v3.2.3"
RUN curl -L "https://get.helm.sh/helm-${HELM_VER}-linux-$TARGETARCH.tar.gz" | tar zx && \
@@ -38,7 +38,7 @@ RUN apk add --no-cache curl && \
FROM alpine:3.18.6 as docker
RUN apk add --no-cache docker-cli docker-cli-buildx
-FROM golang:1.21.9-bullseye as drone
+FROM golang:1.22.2-bookworm as drone
ARG TARGETARCH
RUN curl -L "https://github.com/drone/drone-cli/releases/download/v1.7.0/drone_linux_$TARGETARCH".tar.gz | tar zx && \
install -t /usr/local/bin drone
@@ -48,35 +48,35 @@ RUN curl -L "https://github.com/drone/drone-cli/releases/download/v1.7.0/drone_l
# Error:
# github.com/fatih/faillint@v1.5.0 requires golang.org/x/tools@v0.0.0-20200207224406-61798d64f025
# (not golang.org/x/tools@v0.0.0-20190918214920-58d531046acd from golang.org/x/tools/cmd/goyacc@58d531046acdc757f177387bc1725bfa79895d69)
-FROM golang:1.21.9-bullseye as faillint
+FROM golang:1.22.2-bookworm as faillint
RUN GO111MODULE=on go install github.com/fatih/faillint@v1.11.0
RUN GO111MODULE=on go install golang.org/x/tools/cmd/goimports@v0.7.0
-FROM golang:1.21.9-bullseye as delve
+FROM golang:1.22.2-bookworm as delve
RUN GO111MODULE=on go install github.com/go-delve/delve/cmd/dlv@latest
# Install ghr used to push binaries and template the release
# This collides with the version of go tools used in the base image, thus we install it in its own image and copy it over.
-FROM golang:1.21.9-bullseye as ghr
+FROM golang:1.22.2-bookworm as ghr
RUN GO111MODULE=on go install github.com/tcnksm/ghr@9349474
# Install nfpm (https://nfpm.goreleaser.com) for creating .deb and .rpm packages.
-FROM golang:1.21.9-bullseye as nfpm
+FROM golang:1.22.2-bookworm as nfpm
RUN GO111MODULE=on go install github.com/goreleaser/nfpm/v2/cmd/nfpm@v2.11.3
# Install gotestsum
-FROM golang:1.21.9-bullseye as gotestsum
+FROM golang:1.22.2-bookworm as gotestsum
RUN GO111MODULE=on go install gotest.tools/gotestsum@v1.8.2
# Install tools used to compile jsonnet.
-FROM golang:1.21.9-bullseye as jsonnet
-RUN GO111MODULE=on go install github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@v0.4.0
-RUN GO111MODULE=on go install github.com/monitoring-mixins/mixtool/cmd/mixtool@bca3066
-RUN GO111MODULE=on go install github.com/google/go-jsonnet/cmd/jsonnet@v0.18.0
+FROM golang:1.22.2-bookworm as jsonnet
+RUN GO111MODULE=on go install github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@v0.5.1
+RUN GO111MODULE=on go install github.com/monitoring-mixins/mixtool/cmd/mixtool@16dc166166d91e93475b86b9355a4faed2400c18
+RUN GO111MODULE=on go install github.com/google/go-jsonnet/cmd/jsonnet@v0.20.0
FROM aquasec/trivy as trivy
-FROM golang:1.21.9-bullseye
+FROM golang:1.22.2-bookworm
RUN apt-get update && \
apt-get install -qy \
musl gnupg ragel \
diff --git a/operator/Dockerfile b/operator/Dockerfile
index 5f155e833f76..6e03c5d92bcc 100644
--- a/operator/Dockerfile
+++ b/operator/Dockerfile
@@ -1,5 +1,5 @@
# Build the manager binary
-FROM golang:1.21.9 as builder
+FROM golang:1.22.2 as builder
WORKDIR /workspace
# Copy the Go Modules manifests
diff --git a/operator/Dockerfile.cross b/operator/Dockerfile.cross
index 060edee23948..a1b6d8853b44 100644
--- a/operator/Dockerfile.cross
+++ b/operator/Dockerfile.cross
@@ -1,6 +1,6 @@
ARG BUILD_IMAGE=grafana/loki-build-image:0.33.1
-FROM golang:1.21.9-alpine as goenv
+FROM golang:1.22.2-alpine as goenv
RUN go env GOARCH > /goarch && \
go env GOARM > /goarm
diff --git a/operator/calculator.Dockerfile b/operator/calculator.Dockerfile
index 9ffd31d1154d..4a1a89cc83dc 100644
--- a/operator/calculator.Dockerfile
+++ b/operator/calculator.Dockerfile
@@ -1,5 +1,5 @@
# Build the calculator binary
-FROM golang:1.21.9 as builder
+FROM golang:1.22.2 as builder
WORKDIR /workspace
# Copy the Go Modules manifests
diff --git a/pkg/logproto/logproto.pb.go b/pkg/logproto/logproto.pb.go
index 300fd59539b9..e8c7215990bf 100644
--- a/pkg/logproto/logproto.pb.go
+++ b/pkg/logproto/logproto.pb.go
@@ -2755,7 +2755,7 @@ type DetectedField struct {
Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
Type DetectedFieldType `protobuf:"bytes,2,opt,name=type,proto3,casttype=DetectedFieldType" json:"type,omitempty"`
Cardinality uint64 `protobuf:"varint,3,opt,name=cardinality,proto3" json:"cardinality,omitempty"`
- Sketch []byte `protobuf:"bytes,4,opt,name=sketch,proto3" json:"-"`
+ Sketch []byte `protobuf:"bytes,4,opt,name=sketch,proto3" json:"sketch,omitempty"`
}
func (m *DetectedField) Reset() { *m = DetectedField{} }
@@ -3033,169 +3033,171 @@ func init() {
func init() { proto.RegisterFile("pkg/logproto/logproto.proto", fileDescriptor_c28a5f14f1f4c79a) }
var fileDescriptor_c28a5f14f1f4c79a = []byte{
- // 2590 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x6f, 0x1b, 0xc7,
- 0x95, 0x4b, 0x2e, 0xbf, 0x1e, 0x29, 0x59, 0x1e, 0xd1, 0x36, 0x41, 0xdb, 0xa4, 0x32, 0x68, 0x13,
- 0x35, 0x76, 0xc4, 0x58, 0x69, 0xd2, 0xc4, 0x69, 0x9a, 0x9a, 0x52, 0xac, 0xc8, 0x51, 0x1c, 0x67,
- 0xa4, 0x38, 0x69, 0xd1, 0x20, 0x58, 0x91, 0x23, 0x6a, 0x21, 0x72, 0x97, 0xde, 0x1d, 0xc6, 0xe1,
- 0xad, 0x7f, 0xa0, 0x68, 0x8a, 0x1e, 0xda, 0x5e, 0x0a, 0x14, 0x28, 0xd0, 0x22, 0x45, 0x2f, 0x45,
- 0x8f, 0x45, 0x7b, 0xe9, 0x21, 0xbd, 0xa5, 0xb7, 0x20, 0x07, 0xb6, 0x56, 0x2e, 0x85, 0x4e, 0x01,
- 0x7a, 0xcb, 0xa9, 0x98, 0xaf, 0xfd, 0x12, 0x59, 0x87, 0x8a, 0x83, 0xc0, 0x17, 0x71, 0xe6, 0xcd,
- 0x9b, 0x37, 0xf3, 0x3e, 0xe6, 0x7d, 0xad, 0xe0, 0xfc, 0xe0, 0xa0, 0xdb, 0xec, 0xb9, 0xdd, 0x81,
- 0xe7, 0x32, 0x37, 0x18, 0xac, 0x88, 0xbf, 0xa8, 0xa0, 0xe7, 0xb5, 0x4a, 0xd7, 0xed, 0xba, 0x12,
- 0x87, 0x8f, 0xe4, 0x7a, 0xad, 0xd1, 0x75, 0xdd, 0x6e, 0x8f, 0x36, 0xc5, 0x6c, 0x77, 0xb8, 0xd7,
- 0x64, 0x76, 0x9f, 0xfa, 0xcc, 0xea, 0x0f, 0x14, 0xc2, 0x92, 0xa2, 0x7e, 0xa7, 0xd7, 0x77, 0x3b,
- 0xb4, 0xd7, 0xf4, 0x99, 0xc5, 0x7c, 0xf9, 0x57, 0x61, 0x2c, 0x72, 0x8c, 0xc1, 0xd0, 0xdf, 0x17,
- 0x7f, 0x24, 0x10, 0xff, 0xd9, 0x80, 0x33, 0x5b, 0xd6, 0x2e, 0xed, 0xed, 0xb8, 0xb7, 0xad, 0xde,
- 0x90, 0xfa, 0x84, 0xfa, 0x03, 0xd7, 0xf1, 0x29, 0x5a, 0x83, 0x5c, 0x8f, 0x2f, 0xf8, 0x55, 0x63,
- 0x29, 0xb3, 0x5c, 0x5a, 0xbd, 0xb4, 0x12, 0x5c, 0x79, 0xe2, 0x06, 0x09, 0xf5, 0x5f, 0x72, 0x98,
- 0x37, 0x22, 0x6a, 0x6b, 0xed, 0x36, 0x94, 0x22, 0x60, 0xb4, 0x00, 0x99, 0x03, 0x3a, 0xaa, 0x1a,
- 0x4b, 0xc6, 0x72, 0x91, 0xf0, 0x21, 0xba, 0x02, 0xd9, 0x77, 0x39, 0x99, 0x6a, 0x7a, 0xc9, 0x58,
- 0x2e, 0xad, 0x9e, 0x0f, 0x0f, 0x79, 0xc3, 0xb1, 0xef, 0x0c, 0xa9, 0xd8, 0xad, 0x0e, 0x92, 0x98,
- 0x57, 0xd3, 0xcf, 0x1a, 0xf8, 0x12, 0x9c, 0x3e, 0xb6, 0x8e, 0xce, 0x42, 0x4e, 0x60, 0xc8, 0x1b,
- 0x17, 0x89, 0x9a, 0xe1, 0x0a, 0xa0, 0x6d, 0xe6, 0x51, 0xab, 0x4f, 0x2c, 0xc6, 0xef, 0x7b, 0x67,
- 0x48, 0x7d, 0x86, 0x5f, 0x85, 0xc5, 0x18, 0x54, 0xb1, 0xfd, 0x0c, 0x94, 0xfc, 0x10, 0xac, 0x78,
- 0xaf, 0x84, 0xd7, 0x0a, 0xf7, 0x90, 0x28, 0x22, 0xfe, 0xb5, 0x01, 0x10, 0xae, 0xa1, 0x3a, 0x80,
- 0x5c, 0x7d, 0xd9, 0xf2, 0xf7, 0x05, 0xc3, 0x26, 0x89, 0x40, 0xd0, 0x65, 0x38, 0x1d, 0xce, 0x6e,
- 0xba, 0xdb, 0xfb, 0x96, 0xd7, 0x11, 0x32, 0x30, 0xc9, 0xf1, 0x05, 0x84, 0xc0, 0xf4, 0x2c, 0x46,
- 0xab, 0x99, 0x25, 0x63, 0x39, 0x43, 0xc4, 0x98, 0x73, 0xcb, 0xa8, 0x63, 0x39, 0xac, 0x6a, 0x0a,
- 0x71, 0xaa, 0x19, 0x87, 0x73, 0xfd, 0x52, 0xbf, 0x9a, 0x5d, 0x32, 0x96, 0xe7, 0x88, 0x9a, 0xe1,
- 0x0f, 0x32, 0x50, 0x7e, 0x7d, 0x48, 0xbd, 0x91, 0x12, 0x00, 0xaa, 0x43, 0xc1, 0xa7, 0x3d, 0xda,
- 0x66, 0xae, 0x27, 0x35, 0xd2, 0x4a, 0x57, 0x0d, 0x12, 0xc0, 0x50, 0x05, 0xb2, 0x3d, 0xbb, 0x6f,
- 0x33, 0x71, 0xad, 0x39, 0x22, 0x27, 0xe8, 0x2a, 0x64, 0x7d, 0x66, 0x79, 0x4c, 0xdc, 0xa5, 0xb4,
- 0x5a, 0x5b, 0x91, 0x86, 0xb9, 0xa2, 0x0d, 0x73, 0x65, 0x47, 0x1b, 0x66, 0xab, 0xf0, 0xe1, 0xb8,
- 0x91, 0x7a, 0xff, 0x5f, 0x0d, 0x83, 0xc8, 0x2d, 0xe8, 0x19, 0xc8, 0x50, 0xa7, 0x23, 0xee, 0xfb,
- 0x45, 0x77, 0xf2, 0x0d, 0xe8, 0x0a, 0x14, 0x3b, 0xb6, 0x47, 0xdb, 0xcc, 0x76, 0x1d, 0xc1, 0xd5,
- 0xfc, 0xea, 0x62, 0xa8, 0x91, 0x75, 0xbd, 0x44, 0x42, 0x2c, 0x74, 0x19, 0x72, 0x3e, 0x17, 0x9d,
- 0x5f, 0xcd, 0x73, 0x5b, 0x68, 0x55, 0x8e, 0xc6, 0x8d, 0x05, 0x09, 0xb9, 0xec, 0xf6, 0x6d, 0x46,
- 0xfb, 0x03, 0x36, 0x22, 0x0a, 0x07, 0x3d, 0x0e, 0xf9, 0x0e, 0xed, 0x51, 0xae, 0xf0, 0x82, 0x50,
- 0xf8, 0x42, 0x84, 0xbc, 0x58, 0x20, 0x1a, 0x01, 0xbd, 0x0d, 0xe6, 0xa0, 0x67, 0x39, 0xd5, 0xa2,
- 0xe0, 0x62, 0x3e, 0x44, 0xbc, 0xd5, 0xb3, 0x9c, 0xd6, 0x73, 0x9f, 0x8c, 0x1b, 0x4f, 0x77, 0x6d,
- 0xb6, 0x3f, 0xdc, 0x5d, 0x69, 0xbb, 0xfd, 0x66, 0xd7, 0xb3, 0xf6, 0x2c, 0xc7, 0x6a, 0xf6, 0xdc,
- 0x03, 0xbb, 0xf9, 0xee, 0x53, 0x4d, 0xfe, 0x06, 0xef, 0x0c, 0xa9, 0x67, 0x53, 0xaf, 0xc9, 0xc9,
- 0xac, 0x08, 0x95, 0xf0, 0xad, 0x44, 0x90, 0xbd, 0x61, 0x16, 0x72, 0x0b, 0x79, 0x7c, 0x2f, 0x0d,
- 0x68, 0xdb, 0xea, 0x0f, 0x7a, 0x74, 0x26, 0x95, 0x05, 0xca, 0x49, 0x9f, 0x58, 0x39, 0x99, 0x59,
- 0x95, 0x13, 0x4a, 0xda, 0x9c, 0x4d, 0xd2, 0xd9, 0x2f, 0x2a, 0xe9, 0xdc, 0x57, 0x22, 0x69, 0x5c,
- 0x05, 0x93, 0xcf, 0xb8, 0x53, 0xf2, 0xac, 0xbb, 0x42, 0x9e, 0x65, 0xc2, 0x87, 0x78, 0x0b, 0x72,
- 0xf2, 0x2e, 0xa8, 0x96, 0x14, 0x78, 0xfc, 0x7d, 0x84, 0xc2, 0xce, 0x68, 0x31, 0x2e, 0x84, 0x62,
- 0xcc, 0x08, 0x01, 0xe1, 0xbf, 0x18, 0x30, 0xa7, 0xb4, 0xa8, 0x7c, 0xcc, 0x2e, 0xe4, 0xe5, 0x1b,
- 0xd7, 0xfe, 0xe5, 0x5c, 0xd2, 0xbf, 0x5c, 0xeb, 0x58, 0x03, 0x46, 0xbd, 0x56, 0xf3, 0xc3, 0x71,
- 0xc3, 0xf8, 0x64, 0xdc, 0x78, 0x6c, 0x1a, 0xa3, 0xda, 0xa7, 0x6b, 0xbf, 0xa4, 0x09, 0xa3, 0x4b,
- 0xe2, 0x76, 0xcc, 0x57, 0xa6, 0x70, 0x6a, 0x45, 0x86, 0x82, 0x4d, 0xa7, 0x4b, 0x7d, 0x4e, 0xd9,
- 0xe4, 0x5a, 0x24, 0x12, 0x87, 0xb3, 0x79, 0xd7, 0xf2, 0x1c, 0xdb, 0xe9, 0xfa, 0xd5, 0x8c, 0xf0,
- 0x9d, 0xc1, 0x1c, 0xff, 0xd2, 0x80, 0xc5, 0x98, 0x29, 0x2a, 0x26, 0x9e, 0x85, 0x9c, 0xcf, 0xa5,
- 0xab, 0x79, 0x88, 0x28, 0x72, 0x5b, 0xc0, 0x5b, 0xf3, 0xea, 0xf2, 0x39, 0x39, 0x27, 0x0a, 0xff,
- 0xc1, 0x5d, 0xed, 0xef, 0x06, 0x94, 0x45, 0x00, 0xd0, 0xef, 0x03, 0x81, 0xe9, 0x58, 0x7d, 0xaa,
- 0x54, 0x25, 0xc6, 0x91, 0xa8, 0xc0, 0x8f, 0x2b, 0xe8, 0xa8, 0x30, 0xab, 0x23, 0x33, 0x4e, 0xec,
- 0xc8, 0x8c, 0xf0, 0xad, 0x54, 0x20, 0xcb, 0x4d, 0x72, 0x24, 0x9c, 0x58, 0x91, 0xc8, 0x09, 0x7e,
- 0x0c, 0xe6, 0x14, 0x17, 0x4a, 0xb4, 0xd3, 0x02, 0x59, 0x1f, 0x72, 0x52, 0x13, 0xe8, 0x1b, 0x50,
- 0x0c, 0x12, 0x00, 0xc1, 0x6d, 0xa6, 0x95, 0x3b, 0x1a, 0x37, 0xd2, 0xcc, 0x27, 0xe1, 0x02, 0x6a,
- 0x44, 0x83, 0xab, 0xd1, 0x2a, 0x1e, 0x8d, 0x1b, 0x12, 0xa0, 0x42, 0x29, 0xba, 0x00, 0xe6, 0x3e,
- 0x8f, 0x4f, 0x5c, 0x04, 0x66, 0xab, 0x70, 0x34, 0x6e, 0x88, 0x39, 0x11, 0x7f, 0xf1, 0x06, 0x94,
- 0xb7, 0x68, 0xd7, 0x6a, 0x8f, 0xd4, 0xa1, 0x15, 0x4d, 0x8e, 0x1f, 0x68, 0x68, 0x1a, 0x8f, 0x40,
- 0x39, 0x38, 0xf1, 0x9d, 0xbe, 0xaf, 0x5e, 0x43, 0x29, 0x80, 0xbd, 0xea, 0xe3, 0x5f, 0x19, 0xa0,
- 0x6c, 0x00, 0xe1, 0x48, 0x56, 0xc1, 0xfd, 0x17, 0x1c, 0x8d, 0x1b, 0x0a, 0xa2, 0x93, 0x06, 0xf4,
- 0x3c, 0xe4, 0x7d, 0x71, 0x22, 0x27, 0x96, 0x34, 0x2d, 0xb1, 0xd0, 0x3a, 0xc5, 0x4d, 0xe4, 0x68,
- 0xdc, 0xd0, 0x88, 0x44, 0x0f, 0xd0, 0x4a, 0x2c, 0xf0, 0x4a, 0xc6, 0xe6, 0x8f, 0xc6, 0x8d, 0x08,
- 0x34, 0x1a, 0x88, 0xf1, 0xe7, 0x06, 0x94, 0x76, 0x2c, 0x3b, 0x30, 0xa1, 0xaa, 0x56, 0x51, 0xe8,
- 0x5f, 0x25, 0x80, 0x5b, 0x62, 0x87, 0xf6, 0xac, 0xd1, 0x75, 0xd7, 0x13, 0x74, 0xe7, 0x48, 0x30,
- 0x0f, 0x63, 0xa5, 0x39, 0x31, 0x56, 0x66, 0x67, 0x77, 0xc7, 0x5f, 0xad, 0xf3, 0xbb, 0x61, 0x16,
- 0xd2, 0x0b, 0x19, 0xfc, 0x47, 0x03, 0xca, 0x92, 0x79, 0x65, 0x79, 0x3f, 0x82, 0x9c, 0x94, 0x8d,
- 0x60, 0xff, 0xff, 0x38, 0xa6, 0x4b, 0xb3, 0x38, 0x25, 0x45, 0x13, 0xbd, 0x08, 0xf3, 0x1d, 0xcf,
- 0x1d, 0x0c, 0x68, 0x67, 0x5b, 0xb9, 0xbf, 0x74, 0xd2, 0xfd, 0xad, 0x47, 0xd7, 0x49, 0x02, 0x1d,
- 0xff, 0xc3, 0x80, 0x39, 0xe5, 0x4c, 0x94, 0xba, 0x02, 0x11, 0x1b, 0x27, 0x8e, 0x78, 0xe9, 0x59,
- 0x23, 0xde, 0x59, 0xc8, 0x75, 0x3d, 0x77, 0x38, 0xd0, 0x0e, 0x49, 0xcd, 0x66, 0x8b, 0x84, 0xf8,
- 0x06, 0xcc, 0x6b, 0x56, 0xa6, 0x78, 0xd4, 0x5a, 0xd2, 0xa3, 0x6e, 0x76, 0xa8, 0xc3, 0xec, 0x3d,
- 0x3b, 0xf0, 0x91, 0x0a, 0x1f, 0xff, 0xd4, 0x80, 0x85, 0x24, 0x0a, 0x5a, 0x4f, 0x24, 0xf0, 0x8f,
- 0x4e, 0x27, 0x17, 0xcd, 0xdd, 0x35, 0x69, 0x95, 0xc1, 0x3f, 0x7d, 0xbf, 0x0c, 0xbe, 0x12, 0x75,
- 0x32, 0x45, 0xe5, 0x15, 0xf0, 0x2f, 0x0c, 0x98, 0x8b, 0xe9, 0x12, 0x3d, 0x0b, 0xe6, 0x9e, 0xe7,
- 0xf6, 0x67, 0x52, 0x94, 0xd8, 0x81, 0xbe, 0x0d, 0x69, 0xe6, 0xce, 0xa4, 0xa6, 0x34, 0x73, 0xb9,
- 0x96, 0x14, 0xfb, 0x19, 0x99, 0x1f, 0xcb, 0x19, 0x7e, 0x1a, 0x8a, 0x82, 0xa1, 0x5b, 0x96, 0xed,
- 0x4d, 0x0c, 0x18, 0x93, 0x19, 0x7a, 0x1e, 0x4e, 0x49, 0x67, 0x38, 0x79, 0x73, 0x79, 0xd2, 0xe6,
- 0xb2, 0xde, 0x7c, 0x1e, 0xb2, 0x6b, 0xfb, 0x43, 0xe7, 0x80, 0x6f, 0xe9, 0x58, 0xcc, 0xd2, 0x5b,
- 0xf8, 0x18, 0x9f, 0x81, 0x45, 0xfe, 0x06, 0xa9, 0xe7, 0xaf, 0xb9, 0x43, 0x87, 0xe9, 0xfa, 0xe4,
- 0x32, 0x54, 0xe2, 0x60, 0x65, 0x25, 0x15, 0xc8, 0xb6, 0x39, 0x40, 0xd0, 0x98, 0x23, 0x72, 0x82,
- 0x7f, 0x6b, 0x00, 0xda, 0xa0, 0x4c, 0x9c, 0xb2, 0xb9, 0x1e, 0x3c, 0x8f, 0x1a, 0x14, 0xfa, 0x16,
- 0x6b, 0xef, 0x53, 0xcf, 0xd7, 0xf9, 0x8b, 0x9e, 0x7f, 0x1d, 0xc9, 0x22, 0xbe, 0x02, 0x8b, 0xb1,
- 0x5b, 0x2a, 0x9e, 0x6a, 0x50, 0x68, 0x2b, 0x98, 0x0a, 0x79, 0xc1, 0x1c, 0xff, 0x29, 0x0d, 0x05,
- 0xb1, 0x81, 0xd0, 0x3d, 0x74, 0x05, 0x4a, 0x7b, 0xb6, 0xd3, 0xa5, 0xde, 0xc0, 0xb3, 0x95, 0x08,
- 0xcc, 0xd6, 0xa9, 0xa3, 0x71, 0x23, 0x0a, 0x26, 0xd1, 0x09, 0x7a, 0x02, 0xf2, 0x43, 0x9f, 0x7a,
- 0xef, 0xd8, 0xf2, 0xa5, 0x17, 0x5b, 0x95, 0xc3, 0x71, 0x23, 0xf7, 0x86, 0x4f, 0xbd, 0xcd, 0x75,
- 0x1e, 0x7c, 0x86, 0x62, 0x44, 0xe4, 0x6f, 0x07, 0xbd, 0xa2, 0xcc, 0x54, 0x24, 0x70, 0xad, 0xef,
- 0xf0, 0xeb, 0x27, 0x5c, 0xdd, 0xc0, 0x73, 0xfb, 0x94, 0xed, 0xd3, 0xa1, 0xdf, 0x6c, 0xbb, 0xfd,
- 0xbe, 0xeb, 0x34, 0x45, 0xc5, 0x2d, 0x98, 0xe6, 0x11, 0x94, 0x6f, 0x57, 0x96, 0xbb, 0x03, 0x79,
- 0xb6, 0xef, 0xb9, 0xc3, 0xee, 0xbe, 0x08, 0x0c, 0x99, 0xd6, 0xd5, 0xd9, 0xe9, 0x69, 0x0a, 0x44,
- 0x0f, 0xd0, 0x23, 0x5c, 0x5a, 0xb4, 0x7d, 0xe0, 0x0f, 0xfb, 0xb2, 0xc6, 0x6b, 0x65, 0x8f, 0xc6,
- 0x0d, 0xe3, 0x09, 0x12, 0x80, 0xf1, 0x4f, 0xd2, 0xd0, 0x88, 0x94, 0xc6, 0xd7, 0x5d, 0xef, 0x55,
- 0xca, 0x3c, 0xbb, 0x7d, 0xd3, 0xea, 0x53, 0x6d, 0x1b, 0x0d, 0x28, 0xf5, 0x05, 0xf0, 0x9d, 0xc8,
- 0x13, 0x80, 0x7e, 0x80, 0x87, 0x2e, 0x02, 0x88, 0x37, 0x23, 0xd7, 0xe5, 0x6b, 0x28, 0x0a, 0x88,
- 0x58, 0x5e, 0x8b, 0x49, 0xaa, 0x39, 0x23, 0x67, 0x4a, 0x42, 0x9b, 0x49, 0x09, 0xcd, 0x4c, 0x27,
- 0x10, 0x4b, 0xd4, 0xd6, 0xb3, 0x71, 0x5b, 0xc7, 0xff, 0x34, 0xa0, 0xbe, 0xa5, 0x6f, 0x7e, 0x42,
- 0x71, 0x68, 0x7e, 0xd3, 0x0f, 0x88, 0xdf, 0xcc, 0x97, 0xe3, 0x17, 0xd7, 0x01, 0xb6, 0x6c, 0x87,
- 0x5e, 0xb7, 0x7b, 0x8c, 0x7a, 0x13, 0xaa, 0x98, 0x9f, 0x67, 0x42, 0x97, 0x40, 0xe8, 0x9e, 0xe6,
- 0x73, 0x2d, 0xe2, 0x87, 0x1f, 0x04, 0x1b, 0xe9, 0x07, 0xa8, 0xb6, 0x4c, 0xc2, 0x45, 0x39, 0x90,
- 0xdf, 0x13, 0xec, 0xc9, 0x90, 0x1a, 0x6b, 0xc4, 0x84, 0xbc, 0xb7, 0xbe, 0xa7, 0x0e, 0x7f, 0xe6,
- 0x3e, 0x19, 0x91, 0x68, 0x8f, 0x35, 0xfd, 0x91, 0xc3, 0xac, 0xf7, 0x22, 0xfb, 0x89, 0x3e, 0x04,
- 0x59, 0x2a, 0xe9, 0xca, 0x4e, 0x4c, 0xba, 0x5e, 0x50, 0xc7, 0x7c, 0xa9, 0xaa, 0xf3, 0x85, 0xd0,
- 0x03, 0x0a, 0xa5, 0x28, 0x0f, 0xf8, 0x28, 0x98, 0x1e, 0xdd, 0xd3, 0xa1, 0x1a, 0x85, 0x27, 0x07,
- 0x98, 0x62, 0x1d, 0xff, 0xd5, 0x80, 0x85, 0x0d, 0xca, 0xe2, 0x49, 0xd0, 0x43, 0xa4, 0x52, 0xfc,
- 0x32, 0x9c, 0x8e, 0xdc, 0x5f, 0x71, 0xff, 0x54, 0x22, 0xf3, 0x39, 0x13, 0xf2, 0xbf, 0xe9, 0x74,
- 0xe8, 0x7b, 0xaa, 0xa0, 0x8c, 0x27, 0x3d, 0xb7, 0xa0, 0x14, 0x59, 0x44, 0xd7, 0x12, 0xe9, 0xce,
- 0x62, 0xa2, 0x5f, 0xc9, 0x43, 0x76, 0xab, 0xa2, 0x78, 0x92, 0x65, 0xa3, 0x4a, 0x66, 0x83, 0xd4,
- 0x60, 0x1b, 0x90, 0x50, 0x97, 0x20, 0x1b, 0x0d, 0x4e, 0x02, 0xfa, 0x4a, 0x90, 0xf7, 0x04, 0x73,
- 0xf4, 0x08, 0x98, 0x9e, 0x7b, 0x57, 0xe7, 0xb1, 0x73, 0xe1, 0x91, 0xc4, 0xbd, 0x4b, 0xc4, 0x12,
- 0x7e, 0x1e, 0x32, 0xc4, 0xbd, 0x8b, 0xea, 0x00, 0x9e, 0xe5, 0x74, 0xe9, 0xed, 0xa0, 0x82, 0x2a,
- 0x93, 0x08, 0x64, 0x4a, 0xe2, 0xb0, 0x06, 0xa7, 0xa3, 0x37, 0x92, 0xea, 0x5e, 0x81, 0xfc, 0xeb,
- 0xc3, 0xa8, 0xb8, 0x2a, 0x09, 0x71, 0xc9, 0x42, 0x5d, 0x23, 0x71, 0x9b, 0x81, 0x10, 0x8e, 0x2e,
- 0x40, 0x91, 0x59, 0xbb, 0x3d, 0x7a, 0x33, 0x74, 0x73, 0x21, 0x80, 0xaf, 0xf2, 0xe2, 0xef, 0x76,
- 0x24, 0x03, 0x0a, 0x01, 0xe8, 0x71, 0x58, 0x08, 0xef, 0x7c, 0xcb, 0xa3, 0x7b, 0xf6, 0x7b, 0x42,
- 0xc3, 0x65, 0x72, 0x0c, 0x8e, 0x96, 0xe1, 0x54, 0x08, 0xdb, 0x16, 0x99, 0x86, 0x29, 0x50, 0x93,
- 0x60, 0x2e, 0x1b, 0xc1, 0xee, 0x4b, 0x77, 0x86, 0x56, 0x4f, 0x3c, 0xbe, 0x32, 0x89, 0x40, 0xf0,
- 0xdf, 0x0c, 0x38, 0x2d, 0x55, 0xcd, 0x2c, 0xf6, 0x50, 0x5a, 0xfd, 0xef, 0x0c, 0x40, 0x51, 0x0e,
- 0x94, 0x69, 0x7d, 0x33, 0xda, 0x08, 0xe2, 0xa9, 0x4c, 0x49, 0xd4, 0xb4, 0x12, 0x14, 0xf6, 0x72,
- 0x30, 0xe4, 0x44, 0x3a, 0x24, 0x8b, 0x6b, 0x53, 0x16, 0xcd, 0x12, 0x42, 0xd4, 0x2f, 0xaf, 0xf5,
- 0x77, 0x47, 0x8c, 0xfa, 0xaa, 0xe4, 0x15, 0xb5, 0xbe, 0x00, 0x10, 0xf9, 0xc3, 0xcf, 0xa2, 0x0e,
- 0x13, 0x56, 0x63, 0x86, 0x67, 0x29, 0x10, 0xd1, 0x03, 0xfc, 0x87, 0x34, 0xcc, 0xdd, 0x76, 0x7b,
- 0xc3, 0x30, 0x30, 0x3e, 0x4c, 0x01, 0x23, 0x56, 0x87, 0x67, 0x75, 0x1d, 0x8e, 0xc0, 0xf4, 0x19,
- 0x1d, 0x08, 0xcb, 0xca, 0x10, 0x31, 0x46, 0x18, 0xca, 0xcc, 0xf2, 0xba, 0x94, 0xc9, 0xea, 0xa6,
- 0x9a, 0x13, 0x69, 0x67, 0x0c, 0x86, 0x96, 0xa0, 0x64, 0x75, 0xbb, 0x1e, 0xed, 0x5a, 0x8c, 0xb6,
- 0x46, 0xd5, 0xbc, 0x38, 0x2c, 0x0a, 0xc2, 0x6f, 0xc1, 0xbc, 0x16, 0x96, 0x52, 0xe9, 0x93, 0x90,
- 0x7f, 0x57, 0x40, 0x26, 0xf4, 0xc5, 0x24, 0xaa, 0x72, 0x63, 0x1a, 0x2d, 0xde, 0x67, 0xd7, 0x77,
- 0xc6, 0x37, 0x20, 0x27, 0xd1, 0xd1, 0x85, 0x68, 0x8d, 0x22, 0x9b, 0x34, 0x7c, 0xae, 0x0a, 0x0e,
- 0x0c, 0x39, 0x49, 0x48, 0x29, 0x5e, 0xd8, 0x86, 0x84, 0x10, 0xf5, 0x8b, 0xff, 0x6b, 0xc0, 0x99,
- 0x75, 0xca, 0x68, 0x9b, 0xd1, 0xce, 0x75, 0x9b, 0xf6, 0x3a, 0x5f, 0x6b, 0xf9, 0x1c, 0x34, 0xc1,
- 0x32, 0x91, 0x26, 0x18, 0xf7, 0x3b, 0x3d, 0xdb, 0xa1, 0x5b, 0x91, 0x2e, 0x4a, 0x08, 0xe0, 0x1e,
- 0x62, 0x8f, 0x5f, 0x5c, 0x2e, 0xcb, 0x0f, 0x1b, 0x11, 0x48, 0xa0, 0xe1, 0x5c, 0xa8, 0x61, 0x6c,
- 0xc3, 0xd9, 0x24, 0xd3, 0x4a, 0x47, 0x4d, 0xc8, 0x89, 0xbd, 0x13, 0xda, 0xaf, 0xb1, 0x1d, 0x44,
- 0xa1, 0x25, 0x8e, 0x4f, 0x27, 0x8f, 0xc7, 0x3f, 0xe3, 0xd5, 0x6e, 0x74, 0xa7, 0x50, 0x2a, 0x37,
- 0x22, 0xe5, 0x60, 0xe5, 0x04, 0x7d, 0x0b, 0x4c, 0x36, 0x1a, 0x28, 0xbf, 0xda, 0x3a, 0xf3, 0xf9,
- 0xb8, 0x71, 0x3a, 0xb6, 0x6d, 0x67, 0x34, 0xa0, 0x44, 0xa0, 0x70, 0xdb, 0x6b, 0x5b, 0x5e, 0xc7,
- 0x76, 0xac, 0x9e, 0xcd, 0xa4, 0xac, 0x4c, 0x12, 0x05, 0xa1, 0x8b, 0x90, 0xf3, 0x0f, 0x28, 0x6b,
- 0xcb, 0xcc, 0xb9, 0xac, 0x8b, 0x00, 0x05, 0xc4, 0xbf, 0x89, 0x28, 0x5d, 0xda, 0xf3, 0x09, 0x95,
- 0x6e, 0x9c, 0x58, 0xe9, 0xc6, 0x7d, 0x94, 0x8e, 0x7f, 0x10, 0xaa, 0x48, 0x5f, 0x51, 0xa9, 0xe8,
- 0x45, 0x98, 0xef, 0xc4, 0x56, 0xa6, 0xab, 0x4a, 0xf6, 0x4e, 0x13, 0xe8, 0x78, 0x23, 0xd4, 0x88,
- 0x80, 0x4c, 0xd1, 0x48, 0x42, 0xcc, 0xe9, 0x63, 0x62, 0x7e, 0xfc, 0x51, 0x28, 0x06, 0x5f, 0x98,
- 0x50, 0x09, 0xf2, 0xd7, 0x5f, 0x23, 0x6f, 0x5e, 0x23, 0xeb, 0x0b, 0x29, 0x54, 0x86, 0x42, 0xeb,
- 0xda, 0xda, 0x2b, 0x62, 0x66, 0xac, 0x7e, 0x90, 0xd3, 0x61, 0xd9, 0x43, 0xdf, 0x85, 0xac, 0x8c,
- 0xb5, 0x67, 0xc3, 0xeb, 0x46, 0x3f, 0xe4, 0xd4, 0xce, 0x1d, 0x83, 0x4b, 0xbe, 0x71, 0xea, 0x49,
- 0x03, 0xdd, 0x84, 0x92, 0x00, 0xaa, 0xb6, 0xeb, 0x85, 0x64, 0xf7, 0x33, 0x46, 0xe9, 0xe2, 0x94,
- 0xd5, 0x08, 0xbd, 0xab, 0x90, 0x95, 0x22, 0x38, 0x9b, 0x48, 0x89, 0x26, 0xdc, 0x26, 0xd6, 0x88,
- 0xc6, 0x29, 0xf4, 0x1c, 0x98, 0x3b, 0x96, 0xdd, 0x43, 0x91, 0x8c, 0x2c, 0xd2, 0x2d, 0xad, 0x9d,
- 0x4d, 0x82, 0x23, 0xc7, 0xbe, 0x10, 0x34, 0x7d, 0xcf, 0x25, 0x3b, 0x4f, 0x7a, 0x7b, 0xf5, 0xf8,
- 0x42, 0x70, 0xf2, 0x6b, 0xb2, 0x35, 0xa9, 0xfb, 0x1f, 0xe8, 0x62, 0xfc, 0xa8, 0x44, 0xbb, 0xa4,
- 0x56, 0x9f, 0xb6, 0x1c, 0x10, 0xdc, 0x82, 0x52, 0xa4, 0xf7, 0x10, 0x15, 0xeb, 0xf1, 0xc6, 0x49,
- 0x54, 0xac, 0x13, 0x1a, 0x16, 0x38, 0x85, 0x36, 0xa0, 0xc0, 0xf3, 0x58, 0xf1, 0x8d, 0xe2, 0x7c,
- 0x32, 0x5d, 0x8d, 0xa4, 0x29, 0xb5, 0x0b, 0x93, 0x17, 0x03, 0x42, 0xdf, 0x87, 0xe2, 0x06, 0x65,
- 0xca, 0xd7, 0x9f, 0x4b, 0x06, 0x8b, 0x09, 0x92, 0x8a, 0x07, 0x1c, 0x9c, 0x42, 0x6f, 0x89, 0x94,
- 0x3a, 0xee, 0xeb, 0x50, 0x63, 0x8a, 0x4f, 0x0b, 0xee, 0xb5, 0x34, 0x1d, 0x21, 0xa0, 0xfc, 0x66,
- 0x8c, 0xb2, 0x8a, 0x8a, 0x8d, 0x29, 0x4f, 0x30, 0xa0, 0xdc, 0xb8, 0xcf, 0x7f, 0x0a, 0xe0, 0xd4,
- 0xea, 0xdb, 0xfa, 0x63, 0xf9, 0xba, 0xc5, 0x2c, 0xf4, 0x1a, 0xcc, 0x0b, 0x59, 0x06, 0x5f, 0xd3,
- 0x63, 0x36, 0x7f, 0xec, 0xd3, 0x7d, 0xcc, 0xe6, 0x8f, 0x7f, 0xc2, 0xc7, 0xa9, 0xd6, 0xdb, 0x1f,
- 0xdd, 0xab, 0xa7, 0x3e, 0xbe, 0x57, 0x4f, 0x7d, 0x76, 0xaf, 0x6e, 0xfc, 0xf8, 0xb0, 0x6e, 0xfc,
- 0xfe, 0xb0, 0x6e, 0x7c, 0x78, 0x58, 0x37, 0x3e, 0x3a, 0xac, 0x1b, 0xff, 0x3e, 0xac, 0x1b, 0xff,
- 0x39, 0xac, 0xa7, 0x3e, 0x3b, 0xac, 0x1b, 0xef, 0x7f, 0x5a, 0x4f, 0x7d, 0xf4, 0x69, 0x3d, 0xf5,
- 0xf1, 0xa7, 0xf5, 0xd4, 0x0f, 0x1f, 0xbb, 0x7f, 0xf9, 0x28, 0x1d, 0x5d, 0x4e, 0xfc, 0x3c, 0xf5,
- 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x90, 0x3c, 0x9c, 0xf7, 0xd2, 0x21, 0x00, 0x00,
+ // 2611 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0x4d, 0x6c, 0x1b, 0xc7,
+ 0xd5, 0x5c, 0x72, 0xf9, 0xf7, 0x48, 0xc9, 0xf2, 0x88, 0xb6, 0x09, 0xda, 0xe1, 0x2a, 0x83, 0xef,
+ 0x4b, 0xdc, 0xd8, 0x11, 0x63, 0xa7, 0x49, 0x1d, 0xa7, 0x69, 0x6a, 0x4a, 0xb1, 0x63, 0x47, 0x71,
+ 0x9c, 0x91, 0xe2, 0xa4, 0x45, 0x83, 0x60, 0x45, 0x8e, 0xa8, 0x85, 0xc8, 0x5d, 0x7a, 0x77, 0x18,
+ 0x87, 0xb7, 0x02, 0x3d, 0x17, 0x0d, 0xd0, 0x43, 0xdb, 0x4b, 0xd1, 0x02, 0x05, 0x5a, 0xa4, 0xe8,
+ 0xa5, 0xe8, 0xb1, 0x68, 0x2f, 0x3d, 0xa4, 0xb7, 0xf4, 0x16, 0xe4, 0xc0, 0xd6, 0xca, 0xa5, 0xd0,
+ 0x29, 0x40, 0x6f, 0x39, 0x15, 0xf3, 0xb3, 0xbb, 0xb3, 0x2b, 0xb2, 0x0e, 0x15, 0x07, 0x81, 0x2f,
+ 0xe2, 0xcc, 0x9b, 0x37, 0x6f, 0xe6, 0xfd, 0xcc, 0xfb, 0x5b, 0xc1, 0xe9, 0xe1, 0x5e, 0xaf, 0xd5,
+ 0xf7, 0x7a, 0x43, 0xdf, 0x63, 0x5e, 0x34, 0x58, 0x15, 0x7f, 0x51, 0x29, 0x9c, 0x37, 0x6a, 0x3d,
+ 0xaf, 0xe7, 0x49, 0x1c, 0x3e, 0x92, 0xeb, 0x0d, 0xab, 0xe7, 0x79, 0xbd, 0x3e, 0x6d, 0x89, 0xd9,
+ 0xf6, 0x68, 0xa7, 0xc5, 0x9c, 0x01, 0x0d, 0x98, 0x3d, 0x18, 0x2a, 0x84, 0x15, 0x45, 0xfd, 0x4e,
+ 0x7f, 0xe0, 0x75, 0x69, 0xbf, 0x15, 0x30, 0x9b, 0x05, 0xf2, 0xaf, 0xc2, 0x58, 0xe6, 0x18, 0xc3,
+ 0x51, 0xb0, 0x2b, 0xfe, 0x48, 0x20, 0xfe, 0x93, 0x01, 0x27, 0x36, 0xec, 0x6d, 0xda, 0xdf, 0xf2,
+ 0x6e, 0xdb, 0xfd, 0x11, 0x0d, 0x08, 0x0d, 0x86, 0x9e, 0x1b, 0x50, 0xb4, 0x06, 0x85, 0x3e, 0x5f,
+ 0x08, 0xea, 0xc6, 0x4a, 0xee, 0x6c, 0xe5, 0xe2, 0xb9, 0xd5, 0xe8, 0xca, 0x53, 0x37, 0x48, 0x68,
+ 0xf0, 0x92, 0xcb, 0xfc, 0x31, 0x51, 0x5b, 0x1b, 0xb7, 0xa1, 0xa2, 0x81, 0xd1, 0x12, 0xe4, 0xf6,
+ 0xe8, 0xb8, 0x6e, 0xac, 0x18, 0x67, 0xcb, 0x84, 0x0f, 0xd1, 0x05, 0xc8, 0xbf, 0xcb, 0xc9, 0xd4,
+ 0xb3, 0x2b, 0xc6, 0xd9, 0xca, 0xc5, 0xd3, 0xf1, 0x21, 0x6f, 0xb8, 0xce, 0x9d, 0x11, 0x15, 0xbb,
+ 0xd5, 0x41, 0x12, 0xf3, 0x72, 0xf6, 0x92, 0x81, 0xcf, 0xc1, 0xf1, 0x43, 0xeb, 0xe8, 0x24, 0x14,
+ 0x04, 0x86, 0xbc, 0x71, 0x99, 0xa8, 0x19, 0xae, 0x01, 0xda, 0x64, 0x3e, 0xb5, 0x07, 0xc4, 0x66,
+ 0xfc, 0xbe, 0x77, 0x46, 0x34, 0x60, 0xf8, 0x55, 0x58, 0x4e, 0x40, 0x15, 0xdb, 0xcf, 0x42, 0x25,
+ 0x88, 0xc1, 0x8a, 0xf7, 0x5a, 0x7c, 0xad, 0x78, 0x0f, 0xd1, 0x11, 0xf1, 0x2f, 0x0d, 0x80, 0x78,
+ 0x0d, 0x35, 0x01, 0xe4, 0xea, 0xcb, 0x76, 0xb0, 0x2b, 0x18, 0x36, 0x89, 0x06, 0x41, 0xe7, 0xe1,
+ 0x78, 0x3c, 0xbb, 0xe9, 0x6d, 0xee, 0xda, 0x7e, 0x57, 0xc8, 0xc0, 0x24, 0x87, 0x17, 0x10, 0x02,
+ 0xd3, 0xb7, 0x19, 0xad, 0xe7, 0x56, 0x8c, 0xb3, 0x39, 0x22, 0xc6, 0x9c, 0x5b, 0x46, 0x5d, 0xdb,
+ 0x65, 0x75, 0x53, 0x88, 0x53, 0xcd, 0x38, 0x9c, 0xeb, 0x97, 0x06, 0xf5, 0xfc, 0x8a, 0x71, 0x76,
+ 0x81, 0xa8, 0x19, 0xfe, 0x20, 0x07, 0xd5, 0xd7, 0x47, 0xd4, 0x1f, 0x2b, 0x01, 0xa0, 0x26, 0x94,
+ 0x02, 0xda, 0xa7, 0x1d, 0xe6, 0xf9, 0x52, 0x23, 0xed, 0x6c, 0xdd, 0x20, 0x11, 0x0c, 0xd5, 0x20,
+ 0xdf, 0x77, 0x06, 0x0e, 0x13, 0xd7, 0x5a, 0x20, 0x72, 0x82, 0x2e, 0x43, 0x3e, 0x60, 0xb6, 0xcf,
+ 0xc4, 0x5d, 0x2a, 0x17, 0x1b, 0xab, 0xd2, 0x30, 0x57, 0x43, 0xc3, 0x5c, 0xdd, 0x0a, 0x0d, 0xb3,
+ 0x5d, 0xfa, 0x70, 0x62, 0x65, 0xde, 0xff, 0xa7, 0x65, 0x10, 0xb9, 0x05, 0x3d, 0x0b, 0x39, 0xea,
+ 0x76, 0xc5, 0x7d, 0xbf, 0xe8, 0x4e, 0xbe, 0x01, 0x5d, 0x80, 0x72, 0xd7, 0xf1, 0x69, 0x87, 0x39,
+ 0x9e, 0x2b, 0xb8, 0x5a, 0xbc, 0xb8, 0x1c, 0x6b, 0x64, 0x3d, 0x5c, 0x22, 0x31, 0x16, 0x3a, 0x0f,
+ 0x85, 0x80, 0x8b, 0x2e, 0xa8, 0x17, 0xb9, 0x2d, 0xb4, 0x6b, 0x07, 0x13, 0x6b, 0x49, 0x42, 0xce,
+ 0x7b, 0x03, 0x87, 0xd1, 0xc1, 0x90, 0x8d, 0x89, 0xc2, 0x41, 0x4f, 0x40, 0xb1, 0x4b, 0xfb, 0x94,
+ 0x2b, 0xbc, 0x24, 0x14, 0xbe, 0xa4, 0x91, 0x17, 0x0b, 0x24, 0x44, 0x40, 0x6f, 0x83, 0x39, 0xec,
+ 0xdb, 0x6e, 0xbd, 0x2c, 0xb8, 0x58, 0x8c, 0x11, 0x6f, 0xf5, 0x6d, 0xb7, 0xfd, 0xdc, 0x27, 0x13,
+ 0xeb, 0x99, 0x9e, 0xc3, 0x76, 0x47, 0xdb, 0xab, 0x1d, 0x6f, 0xd0, 0xea, 0xf9, 0xf6, 0x8e, 0xed,
+ 0xda, 0xad, 0xbe, 0xb7, 0xe7, 0xb4, 0xde, 0x7d, 0xba, 0xc5, 0xdf, 0xe0, 0x9d, 0x11, 0xf5, 0x1d,
+ 0xea, 0xb7, 0x38, 0x99, 0x55, 0xa1, 0x12, 0xbe, 0x95, 0x08, 0xb2, 0x37, 0xcc, 0x52, 0x61, 0xa9,
+ 0x88, 0xef, 0x65, 0x01, 0x6d, 0xda, 0x83, 0x61, 0x9f, 0xce, 0xa5, 0xb2, 0x48, 0x39, 0xd9, 0x23,
+ 0x2b, 0x27, 0x37, 0xaf, 0x72, 0x62, 0x49, 0x9b, 0xf3, 0x49, 0x3a, 0xff, 0x45, 0x25, 0x5d, 0xf8,
+ 0x4a, 0x24, 0x8d, 0xeb, 0x60, 0xf2, 0x19, 0x77, 0x4a, 0xbe, 0x7d, 0x57, 0xc8, 0xb3, 0x4a, 0xf8,
+ 0x10, 0x6f, 0x40, 0x41, 0xde, 0x05, 0x35, 0xd2, 0x02, 0x4f, 0xbe, 0x8f, 0x58, 0xd8, 0xb9, 0x50,
+ 0x8c, 0x4b, 0xb1, 0x18, 0x73, 0x42, 0x40, 0xf8, 0xcf, 0x06, 0x2c, 0x28, 0x2d, 0x2a, 0x1f, 0xb3,
+ 0x0d, 0x45, 0xf9, 0xc6, 0x43, 0xff, 0x72, 0x2a, 0xed, 0x5f, 0xae, 0x74, 0xed, 0x21, 0xa3, 0x7e,
+ 0xbb, 0xf5, 0xe1, 0xc4, 0x32, 0x3e, 0x99, 0x58, 0x8f, 0xcf, 0x62, 0x34, 0xf4, 0xe9, 0xa1, 0x5f,
+ 0x0a, 0x09, 0xa3, 0x73, 0xe2, 0x76, 0x2c, 0x50, 0xa6, 0x70, 0x6c, 0x55, 0x86, 0x82, 0xeb, 0x6e,
+ 0x8f, 0x06, 0x9c, 0xb2, 0xc9, 0xb5, 0x48, 0x24, 0x0e, 0x67, 0xf3, 0xae, 0xed, 0xbb, 0x8e, 0xdb,
+ 0x0b, 0xea, 0x39, 0xe1, 0x3b, 0xa3, 0x39, 0xfe, 0xb9, 0x01, 0xcb, 0x09, 0x53, 0x54, 0x4c, 0x5c,
+ 0x82, 0x42, 0xc0, 0xa5, 0x1b, 0xf2, 0xa0, 0x29, 0x72, 0x53, 0xc0, 0xdb, 0x8b, 0xea, 0xf2, 0x05,
+ 0x39, 0x27, 0x0a, 0xff, 0xc1, 0x5d, 0xed, 0x6f, 0x06, 0x54, 0x45, 0x00, 0x08, 0xdf, 0x07, 0x02,
+ 0xd3, 0xb5, 0x07, 0x54, 0xa9, 0x4a, 0x8c, 0xb5, 0xa8, 0xc0, 0x8f, 0x2b, 0x85, 0x51, 0x61, 0x5e,
+ 0x47, 0x66, 0x1c, 0xd9, 0x91, 0x19, 0xf1, 0x5b, 0xa9, 0x41, 0x9e, 0x9b, 0xe4, 0x58, 0x38, 0xb1,
+ 0x32, 0x91, 0x13, 0xfc, 0x38, 0x2c, 0x28, 0x2e, 0x94, 0x68, 0x67, 0x05, 0xb2, 0x01, 0x14, 0xa4,
+ 0x26, 0xd0, 0xff, 0x41, 0x39, 0x4a, 0x00, 0x04, 0xb7, 0xb9, 0x76, 0xe1, 0x60, 0x62, 0x65, 0x59,
+ 0x40, 0xe2, 0x05, 0x64, 0xe9, 0xc1, 0xd5, 0x68, 0x97, 0x0f, 0x26, 0x96, 0x04, 0xa8, 0x50, 0x8a,
+ 0xce, 0x80, 0xb9, 0xcb, 0xe3, 0x13, 0x17, 0x81, 0xd9, 0x2e, 0x1d, 0x4c, 0x2c, 0x31, 0x27, 0xe2,
+ 0x2f, 0xbe, 0x06, 0xd5, 0x0d, 0xda, 0xb3, 0x3b, 0x63, 0x75, 0x68, 0x2d, 0x24, 0xc7, 0x0f, 0x34,
+ 0x42, 0x1a, 0x8f, 0x42, 0x35, 0x3a, 0xf1, 0x9d, 0x41, 0xa0, 0x5e, 0x43, 0x25, 0x82, 0xbd, 0x1a,
+ 0xe0, 0x5f, 0x18, 0xa0, 0x6c, 0x00, 0x61, 0x2d, 0xab, 0xe0, 0xfe, 0x0b, 0x0e, 0x26, 0x96, 0x82,
+ 0x84, 0x49, 0x03, 0x7a, 0x1e, 0x8a, 0x81, 0x38, 0x91, 0x13, 0x4b, 0x9b, 0x96, 0x58, 0x68, 0x1f,
+ 0xe3, 0x26, 0x72, 0x30, 0xb1, 0x42, 0x44, 0x12, 0x0e, 0xd0, 0x6a, 0x22, 0xf0, 0x4a, 0xc6, 0x16,
+ 0x0f, 0x26, 0x96, 0x06, 0xd5, 0x03, 0x31, 0xfe, 0xdc, 0x80, 0xca, 0x96, 0xed, 0x44, 0x26, 0x54,
+ 0x0f, 0x55, 0x14, 0xfb, 0x57, 0x09, 0xe0, 0x96, 0xd8, 0xa5, 0x7d, 0x7b, 0x7c, 0xd5, 0xf3, 0x05,
+ 0xdd, 0x05, 0x12, 0xcd, 0xe3, 0x58, 0x69, 0x4e, 0x8d, 0x95, 0xf9, 0xf9, 0xdd, 0xf1, 0x57, 0xeb,
+ 0xfc, 0x6e, 0x98, 0xa5, 0xec, 0x52, 0x0e, 0xff, 0xc1, 0x80, 0xaa, 0x64, 0x5e, 0x59, 0xde, 0x0f,
+ 0xa0, 0x20, 0x65, 0x23, 0xd8, 0xff, 0x1f, 0x8e, 0xe9, 0xdc, 0x3c, 0x4e, 0x49, 0xd1, 0x44, 0x2f,
+ 0xc2, 0x62, 0xd7, 0xf7, 0x86, 0x43, 0xda, 0xdd, 0x54, 0xee, 0x2f, 0x9b, 0x76, 0x7f, 0xeb, 0xfa,
+ 0x3a, 0x49, 0xa1, 0xe3, 0xbf, 0x1b, 0xb0, 0xa0, 0x9c, 0x89, 0x52, 0x57, 0x24, 0x62, 0xe3, 0xc8,
+ 0x11, 0x2f, 0x3b, 0x6f, 0xc4, 0x3b, 0x09, 0x85, 0x9e, 0xef, 0x8d, 0x86, 0xa1, 0x43, 0x52, 0xb3,
+ 0xf9, 0x22, 0x21, 0xbe, 0x01, 0x8b, 0x21, 0x2b, 0x33, 0x3c, 0x6a, 0x23, 0xed, 0x51, 0xaf, 0x77,
+ 0xa9, 0xcb, 0x9c, 0x1d, 0x27, 0xf2, 0x91, 0x0a, 0x1f, 0xff, 0xc4, 0x80, 0xa5, 0x34, 0x0a, 0x5a,
+ 0x4f, 0x25, 0xf0, 0x8f, 0xcd, 0x26, 0xa7, 0xe7, 0xee, 0x21, 0x69, 0x95, 0xc1, 0x3f, 0x73, 0xbf,
+ 0x0c, 0xbe, 0xa6, 0x3b, 0x99, 0xb2, 0xf2, 0x0a, 0xf8, 0x67, 0x06, 0x2c, 0x24, 0x74, 0x89, 0x2e,
+ 0x81, 0xb9, 0xe3, 0x7b, 0x83, 0xb9, 0x14, 0x25, 0x76, 0xa0, 0x6f, 0x42, 0x96, 0x79, 0x73, 0xa9,
+ 0x29, 0xcb, 0x3c, 0xae, 0x25, 0xc5, 0x7e, 0x4e, 0xe6, 0xc7, 0x72, 0x86, 0x9f, 0x81, 0xb2, 0x60,
+ 0xe8, 0x96, 0xed, 0xf8, 0x53, 0x03, 0xc6, 0x74, 0x86, 0x9e, 0x87, 0x63, 0xd2, 0x19, 0x4e, 0xdf,
+ 0x5c, 0x9d, 0xb6, 0xb9, 0x1a, 0x6e, 0x3e, 0x0d, 0xf9, 0xb5, 0xdd, 0x91, 0xbb, 0xc7, 0xb7, 0x74,
+ 0x6d, 0x66, 0x87, 0x5b, 0xf8, 0x18, 0x9f, 0x80, 0x65, 0xfe, 0x06, 0xa9, 0x1f, 0xac, 0x79, 0x23,
+ 0x97, 0x85, 0xf5, 0xc9, 0x79, 0xa8, 0x25, 0xc1, 0xca, 0x4a, 0x6a, 0x90, 0xef, 0x70, 0x80, 0xa0,
+ 0xb1, 0x40, 0xe4, 0x04, 0xff, 0xc6, 0x00, 0x74, 0x8d, 0x32, 0x71, 0xca, 0xf5, 0xf5, 0xe8, 0x79,
+ 0x34, 0xa0, 0x34, 0xb0, 0x59, 0x67, 0x97, 0xfa, 0x41, 0x98, 0xbf, 0x84, 0xf3, 0xaf, 0x23, 0x59,
+ 0xc4, 0x17, 0x60, 0x39, 0x71, 0x4b, 0xc5, 0x53, 0x03, 0x4a, 0x1d, 0x05, 0x53, 0x21, 0x2f, 0x9a,
+ 0xe3, 0x3f, 0x66, 0xa1, 0x24, 0x36, 0x10, 0xba, 0x83, 0x2e, 0x40, 0x65, 0xc7, 0x71, 0x7b, 0xd4,
+ 0x1f, 0xfa, 0x8e, 0x12, 0x81, 0xd9, 0x3e, 0x76, 0x30, 0xb1, 0x74, 0x30, 0xd1, 0x27, 0xe8, 0x49,
+ 0x28, 0x8e, 0x02, 0xea, 0xbf, 0xe3, 0xc8, 0x97, 0x5e, 0x6e, 0xd7, 0xf6, 0x27, 0x56, 0xe1, 0x8d,
+ 0x80, 0xfa, 0xd7, 0xd7, 0x79, 0xf0, 0x19, 0x89, 0x11, 0x91, 0xbf, 0x5d, 0xf4, 0x8a, 0x32, 0x53,
+ 0x91, 0xc0, 0xb5, 0xbf, 0xc5, 0xaf, 0x9f, 0x72, 0x75, 0x43, 0xdf, 0x1b, 0x50, 0xb6, 0x4b, 0x47,
+ 0x41, 0xab, 0xe3, 0x0d, 0x06, 0x9e, 0xdb, 0x12, 0x15, 0xb7, 0x60, 0x9a, 0x47, 0x50, 0xbe, 0x5d,
+ 0x59, 0xee, 0x16, 0x14, 0xd9, 0xae, 0xef, 0x8d, 0x7a, 0xbb, 0x22, 0x30, 0xe4, 0xda, 0x97, 0xe7,
+ 0xa7, 0x17, 0x52, 0x20, 0xe1, 0x00, 0x3d, 0xca, 0xa5, 0x45, 0x3b, 0x7b, 0xc1, 0x68, 0x20, 0x6b,
+ 0xbc, 0x76, 0xfe, 0x60, 0x62, 0x19, 0x4f, 0x92, 0x08, 0x8c, 0x7f, 0x9c, 0x05, 0x4b, 0x2b, 0x8d,
+ 0xaf, 0x7a, 0xfe, 0xab, 0x94, 0xf9, 0x4e, 0xe7, 0xa6, 0x3d, 0xa0, 0xa1, 0x6d, 0x58, 0x50, 0x19,
+ 0x08, 0xe0, 0x3b, 0xda, 0x13, 0x80, 0x41, 0x84, 0x87, 0x1e, 0x01, 0x10, 0x6f, 0x46, 0xae, 0xcb,
+ 0xd7, 0x50, 0x16, 0x10, 0xb1, 0xbc, 0x96, 0x90, 0x54, 0x6b, 0x4e, 0xce, 0x94, 0x84, 0xae, 0xa7,
+ 0x25, 0x34, 0x37, 0x9d, 0x48, 0x2c, 0xba, 0xad, 0xe7, 0x93, 0xb6, 0x8e, 0xff, 0x61, 0x40, 0x73,
+ 0x23, 0xbc, 0xf9, 0x11, 0xc5, 0x11, 0xf2, 0x9b, 0x7d, 0x40, 0xfc, 0xe6, 0xbe, 0x1c, 0xbf, 0xb8,
+ 0x09, 0xb0, 0xe1, 0xb8, 0xf4, 0xaa, 0xd3, 0x67, 0xd4, 0x9f, 0x52, 0xc5, 0xfc, 0x34, 0x17, 0xbb,
+ 0x04, 0x42, 0x77, 0x42, 0x3e, 0xd7, 0x34, 0x3f, 0xfc, 0x20, 0xd8, 0xc8, 0x3e, 0x40, 0xb5, 0xe5,
+ 0x52, 0x2e, 0xca, 0x85, 0xe2, 0x8e, 0x60, 0x4f, 0x86, 0xd4, 0x44, 0x23, 0x26, 0xe6, 0xbd, 0xfd,
+ 0x1d, 0x75, 0xf8, 0xb3, 0xf7, 0xc9, 0x88, 0x44, 0x7b, 0xac, 0x15, 0x8c, 0x5d, 0x66, 0xbf, 0xa7,
+ 0xed, 0x27, 0xe1, 0x21, 0xc8, 0x56, 0x49, 0x57, 0x7e, 0x6a, 0xd2, 0xf5, 0x82, 0x3a, 0xe6, 0x4b,
+ 0x55, 0x9d, 0x2f, 0xc4, 0x1e, 0x50, 0x28, 0x45, 0x79, 0xc0, 0xc7, 0xc0, 0xf4, 0xe9, 0x4e, 0x18,
+ 0xaa, 0x51, 0x7c, 0x72, 0x84, 0x29, 0xd6, 0xf1, 0x5f, 0x0c, 0x58, 0xba, 0x46, 0x59, 0x32, 0x09,
+ 0x7a, 0x88, 0x54, 0x8a, 0x5f, 0x86, 0xe3, 0xda, 0xfd, 0x15, 0xf7, 0x4f, 0xa7, 0x32, 0x9f, 0x13,
+ 0x31, 0xff, 0xd7, 0xdd, 0x2e, 0x7d, 0x4f, 0x15, 0x94, 0xc9, 0xa4, 0xe7, 0x16, 0x54, 0xb4, 0x45,
+ 0x74, 0x25, 0x95, 0xee, 0x2c, 0xa7, 0xfa, 0x95, 0x3c, 0x64, 0xb7, 0x6b, 0x8a, 0x27, 0x59, 0x36,
+ 0xaa, 0x64, 0x36, 0x4a, 0x0d, 0x36, 0x01, 0x09, 0x75, 0x09, 0xb2, 0x7a, 0x70, 0x12, 0xd0, 0x57,
+ 0xa2, 0xbc, 0x27, 0x9a, 0xa3, 0x47, 0xc1, 0xf4, 0xbd, 0xbb, 0x61, 0x1e, 0xbb, 0x10, 0x1f, 0x49,
+ 0xbc, 0xbb, 0x44, 0x2c, 0xe1, 0xe7, 0x21, 0x47, 0xbc, 0xbb, 0xa8, 0x09, 0xe0, 0xdb, 0x6e, 0x8f,
+ 0xde, 0x8e, 0x2a, 0xa8, 0x2a, 0xd1, 0x20, 0x33, 0x12, 0x87, 0x35, 0x38, 0xae, 0xdf, 0x48, 0xaa,
+ 0x7b, 0x15, 0x8a, 0xaf, 0x8f, 0x74, 0x71, 0xd5, 0x52, 0xe2, 0x92, 0x85, 0x7a, 0x88, 0xc4, 0x6d,
+ 0x06, 0x62, 0x38, 0x3a, 0x03, 0x65, 0x66, 0x6f, 0xf7, 0xe9, 0xcd, 0xd8, 0xcd, 0xc5, 0x00, 0xbe,
+ 0xca, 0x8b, 0xbf, 0xdb, 0x5a, 0x06, 0x14, 0x03, 0xd0, 0x13, 0xb0, 0x14, 0xdf, 0xf9, 0x96, 0x4f,
+ 0x77, 0x9c, 0xf7, 0x84, 0x86, 0xab, 0xe4, 0x10, 0x1c, 0x9d, 0x85, 0x63, 0x31, 0x6c, 0x53, 0x64,
+ 0x1a, 0xa6, 0x40, 0x4d, 0x83, 0xb9, 0x6c, 0x04, 0xbb, 0x2f, 0xdd, 0x19, 0xd9, 0x7d, 0xf1, 0xf8,
+ 0xaa, 0x44, 0x83, 0xe0, 0xbf, 0x1a, 0x70, 0x5c, 0xaa, 0x9a, 0xd9, 0xec, 0xa1, 0xb4, 0xfa, 0xdf,
+ 0x1a, 0x80, 0x74, 0x0e, 0x94, 0x69, 0xfd, 0xbf, 0xde, 0x08, 0xe2, 0xa9, 0x4c, 0x45, 0xd4, 0xb4,
+ 0x12, 0x14, 0xf7, 0x72, 0x30, 0x14, 0x44, 0x3a, 0x24, 0x8b, 0x6b, 0x53, 0x16, 0xcd, 0x12, 0x42,
+ 0xd4, 0x2f, 0xaf, 0xf5, 0xb7, 0xc7, 0x8c, 0x06, 0xaa, 0xe4, 0x15, 0xb5, 0xbe, 0x00, 0x10, 0xf9,
+ 0xc3, 0xcf, 0xa2, 0x2e, 0x13, 0x56, 0x63, 0xc6, 0x67, 0x29, 0x10, 0x09, 0x07, 0xf8, 0xf7, 0x59,
+ 0x58, 0xb8, 0xed, 0xf5, 0x47, 0x71, 0x60, 0x7c, 0x98, 0x02, 0x46, 0xa2, 0x0e, 0xcf, 0x87, 0x75,
+ 0x38, 0x02, 0x33, 0x60, 0x74, 0x28, 0x2c, 0x2b, 0x47, 0xc4, 0x18, 0x61, 0xa8, 0x32, 0xdb, 0xef,
+ 0x51, 0x26, 0xab, 0x9b, 0x7a, 0x41, 0xa4, 0x9d, 0x09, 0x18, 0x5a, 0x81, 0x8a, 0xdd, 0xeb, 0xf9,
+ 0xb4, 0x67, 0x33, 0xda, 0x1e, 0xd7, 0x8b, 0xe2, 0x30, 0x1d, 0x84, 0xdf, 0x82, 0xc5, 0x50, 0x58,
+ 0x4a, 0xa5, 0x4f, 0x41, 0xf1, 0x5d, 0x01, 0x99, 0xd2, 0x17, 0x93, 0xa8, 0xca, 0x8d, 0x85, 0x68,
+ 0xc9, 0x3e, 0x7b, 0x78, 0x67, 0x7c, 0x03, 0x0a, 0x12, 0x1d, 0x9d, 0xd1, 0x6b, 0x14, 0xd9, 0xa4,
+ 0xe1, 0x73, 0x55, 0x70, 0x60, 0x28, 0x48, 0x42, 0x4a, 0xf1, 0xc2, 0x36, 0x24, 0x84, 0xa8, 0x5f,
+ 0xfc, 0x1f, 0x03, 0x4e, 0xac, 0x53, 0x46, 0x3b, 0x8c, 0x76, 0xaf, 0x3a, 0xb4, 0xdf, 0xfd, 0x5a,
+ 0xcb, 0xe7, 0xa8, 0x09, 0x96, 0xd3, 0x9a, 0x60, 0xdc, 0xef, 0xf4, 0x1d, 0x97, 0x6e, 0x68, 0x5d,
+ 0x94, 0x18, 0xc0, 0x3d, 0xc4, 0x0e, 0xbf, 0xb8, 0x5c, 0x96, 0x1f, 0x36, 0x34, 0x48, 0xa4, 0xe1,
+ 0x42, 0xac, 0x61, 0xfc, 0x23, 0x03, 0x4e, 0xa6, 0xb9, 0x56, 0x4a, 0x6a, 0x41, 0x41, 0x6c, 0x9e,
+ 0xd2, 0x7f, 0x4d, 0xec, 0x20, 0x0a, 0x0d, 0x5d, 0x4a, 0x9c, 0x2f, 0x3e, 0x88, 0xb4, 0xeb, 0x07,
+ 0x13, 0xab, 0x16, 0x43, 0xb5, 0x12, 0x5f, 0xc3, 0xc5, 0xbf, 0xe2, 0x85, 0xb0, 0x4e, 0x53, 0xe8,
+ 0x9b, 0xdb, 0x97, 0xf2, 0xbd, 0x72, 0x82, 0xbe, 0x01, 0x26, 0x1b, 0x0f, 0x95, 0xcb, 0x6d, 0x9f,
+ 0xf8, 0x7c, 0x62, 0x1d, 0x4f, 0x6c, 0xdb, 0x1a, 0x0f, 0x29, 0x11, 0x28, 0xdc, 0x2c, 0x3b, 0xb6,
+ 0xdf, 0x75, 0x5c, 0xbb, 0xef, 0x30, 0x29, 0x46, 0x93, 0xe8, 0x20, 0xd1, 0x89, 0xd8, 0xa3, 0xac,
+ 0x23, 0x93, 0xea, 0xaa, 0xea, 0x44, 0x08, 0x48, 0xa2, 0x13, 0x21, 0x20, 0xf8, 0xd7, 0x9a, 0x79,
+ 0x48, 0xcb, 0x3f, 0xa2, 0x79, 0x18, 0x47, 0x36, 0x0f, 0xe3, 0x3e, 0xe6, 0x81, 0xbf, 0x17, 0xeb,
+ 0x32, 0xbc, 0xa2, 0xd2, 0xe5, 0x8b, 0xb0, 0xd8, 0x4d, 0xac, 0xcc, 0xd6, 0xa9, 0xec, 0xb2, 0xa6,
+ 0xd0, 0xf1, 0xb5, 0x58, 0x41, 0x02, 0x32, 0x43, 0x41, 0x29, 0xa9, 0x67, 0x0f, 0x49, 0xfd, 0x89,
+ 0xc7, 0xa0, 0x1c, 0x7d, 0x8b, 0x42, 0x15, 0x28, 0x5e, 0x7d, 0x8d, 0xbc, 0x79, 0x85, 0xac, 0x2f,
+ 0x65, 0x50, 0x15, 0x4a, 0xed, 0x2b, 0x6b, 0xaf, 0x88, 0x99, 0x71, 0xf1, 0x83, 0x42, 0x18, 0xc0,
+ 0x7d, 0xf4, 0x6d, 0xc8, 0xcb, 0xa8, 0x7c, 0x32, 0xbe, 0xae, 0xfe, 0xc9, 0xa7, 0x71, 0xea, 0x10,
+ 0x5c, 0xf2, 0x8d, 0x33, 0x4f, 0x19, 0xe8, 0x26, 0x54, 0x04, 0x50, 0x35, 0x68, 0xcf, 0xa4, 0xfb,
+ 0xa4, 0x09, 0x4a, 0x8f, 0xcc, 0x58, 0xd5, 0xe8, 0x5d, 0x86, 0xbc, 0x14, 0xc1, 0xc9, 0x54, 0xf2,
+ 0x34, 0xe5, 0x36, 0x89, 0x96, 0x35, 0xce, 0xa0, 0xe7, 0xc0, 0xdc, 0xb2, 0x9d, 0x3e, 0xd2, 0x72,
+ 0x37, 0xad, 0xaf, 0xda, 0x38, 0x99, 0x06, 0x6b, 0xc7, 0xbe, 0x10, 0xb5, 0x87, 0x4f, 0xa5, 0x7b,
+ 0x54, 0xe1, 0xf6, 0xfa, 0xe1, 0x85, 0xe8, 0xe4, 0xd7, 0x64, 0x13, 0x33, 0xec, 0x94, 0xa0, 0x47,
+ 0x92, 0x47, 0xa5, 0x1a, 0x2b, 0x8d, 0xe6, 0xac, 0xe5, 0x88, 0xe0, 0x06, 0x54, 0xb4, 0x2e, 0x85,
+ 0x2e, 0xd6, 0xc3, 0x2d, 0x16, 0x5d, 0xac, 0x53, 0x5a, 0x1b, 0x38, 0x83, 0xae, 0x41, 0x89, 0x67,
+ 0xbc, 0xe2, 0x6b, 0xc6, 0xe9, 0x74, 0x62, 0xab, 0x25, 0x34, 0x8d, 0x33, 0xd3, 0x17, 0x23, 0x42,
+ 0xdf, 0x85, 0xf2, 0x35, 0xca, 0x54, 0x54, 0x38, 0x95, 0x0e, 0x2b, 0x53, 0x24, 0x95, 0x0c, 0x4d,
+ 0x38, 0x83, 0xde, 0x12, 0xc9, 0x77, 0xd2, 0x29, 0x22, 0x6b, 0x86, 0xf3, 0x8b, 0xee, 0xb5, 0x32,
+ 0x1b, 0x21, 0xa2, 0xfc, 0x66, 0x82, 0xb2, 0x8a, 0x9f, 0xd6, 0x8c, 0x27, 0x18, 0x51, 0xb6, 0xee,
+ 0xf3, 0x3f, 0x05, 0x38, 0x73, 0xf1, 0xed, 0xf0, 0xb3, 0xfa, 0xba, 0xcd, 0x6c, 0xf4, 0x1a, 0x2c,
+ 0x0a, 0x59, 0x46, 0xdf, 0xdd, 0x13, 0x36, 0x7f, 0xe8, 0x23, 0x7f, 0xc2, 0xe6, 0x0f, 0x7f, 0xec,
+ 0xc7, 0x99, 0xf6, 0xdb, 0x1f, 0xdd, 0x6b, 0x66, 0x3e, 0xbe, 0xd7, 0xcc, 0x7c, 0x76, 0xaf, 0x69,
+ 0xfc, 0x70, 0xbf, 0x69, 0xfc, 0x6e, 0xbf, 0x69, 0x7c, 0xb8, 0xdf, 0x34, 0x3e, 0xda, 0x6f, 0x1a,
+ 0xff, 0xda, 0x6f, 0x1a, 0xff, 0xde, 0x6f, 0x66, 0x3e, 0xdb, 0x6f, 0x1a, 0xef, 0x7f, 0xda, 0xcc,
+ 0x7c, 0xf4, 0x69, 0x33, 0xf3, 0xf1, 0xa7, 0xcd, 0xcc, 0xf7, 0x1f, 0xbf, 0x7f, 0xa1, 0x29, 0x1d,
+ 0x5d, 0x41, 0xfc, 0x3c, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xfa, 0x1a, 0x95, 0xfc,
+ 0x21, 0x00, 0x00,
}
func (x Direction) String() string {
diff --git a/pkg/logproto/logproto.proto b/pkg/logproto/logproto.proto
index 487eea41dce0..830fbfe627ab 100644
--- a/pkg/logproto/logproto.proto
+++ b/pkg/logproto/logproto.proto
@@ -452,7 +452,7 @@ message DetectedFieldsRequest {
message DetectedFieldsResponse {
repeated DetectedField fields = 1;
- uint32 fieldLimit = 2;
+ uint32 fieldLimit = 2 [(gogoproto.jsontag) = "fieldLimit,omitempty"];
}
// TODO: make the detected field include the serialized sketch
@@ -461,7 +461,7 @@ message DetectedField {
string label = 1;
string type = 2 [(gogoproto.casttype) = "DetectedFieldType"];
uint64 cardinality = 3;
- bytes sketch = 4 [(gogoproto.jsontag) = "-"]; //serialized hyperloglog sketch
+ bytes sketch = 4 [(gogoproto.jsontag) = "sketch,omitempty"];
}
message DetectedLabelsRequest {
diff --git a/pkg/loki/modules.go b/pkg/loki/modules.go
index 843fd5054fb8..04b816b96fed 100644
--- a/pkg/loki/modules.go
+++ b/pkg/loki/modules.go
@@ -1087,6 +1087,7 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) {
t.Server.HTTP.Path("/loki/api/v1/series").Methods("GET", "POST").Handler(frontendHandler)
t.Server.HTTP.Path("/loki/api/v1/patterns").Methods("GET", "POST").Handler(frontendHandler)
t.Server.HTTP.Path("/loki/api/v1/detected_labels").Methods("GET", "POST").Handler(frontendHandler)
+ t.Server.HTTP.Path("/loki/api/v1/detected_fields").Methods("GET", "POST").Handler(frontendHandler)
t.Server.HTTP.Path("/loki/api/v1/index/stats").Methods("GET", "POST").Handler(frontendHandler)
t.Server.HTTP.Path("/loki/api/v1/index/shards").Methods("GET", "POST").Handler(frontendHandler)
t.Server.HTTP.Path("/loki/api/v1/index/volume").Methods("GET", "POST").Handler(frontendHandler)
@@ -1104,12 +1105,6 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) {
t.Server.HTTP.Path("/api/prom/tail").Methods("GET", "POST").Handler(defaultHandler)
}
- // We don't marshal the hyperloglog sketch in the detected fields response to JSON, so this endpoint
- // only works correctly in V2 with protobuf encoding enabled.
- if frontendV2 != nil && frontendV2.IsProtobufEncoded() {
- t.Server.HTTP.Path("/loki/api/v1/detected_fields").Methods("GET", "POST").Handler(frontendHandler)
- }
-
if t.frontend == nil {
return services.NewIdleService(nil, func(_ error) error {
if t.stopper != nil {
diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go
index df75af917292..b2e61b1bdb68 100644
--- a/pkg/querier/querier.go
+++ b/pkg/querier/querier.go
@@ -1018,7 +1018,7 @@ func (q *SingleTenantQuerier) DetectedFields(ctx context.Context, req *logproto.
// TODO(twhitney): converting from a step to a duration should be abstracted and reused,
// doing this in a few places now.
- streams, err := streamsForFieldDetection(iters, req.LineLimit, time.Duration(req.Step))
+ streams, err := streamsForFieldDetection(iters, req.LineLimit)
if err != nil {
return nil, err
}
@@ -1186,11 +1186,11 @@ func parseLine(line string) map[string][]string {
return result
}
-// readStreams reads the streams from the iterator and returns them sorted.
+// streamsForFieldDetection reads the streams from the iterator and returns them sorted.
// If categorizeLabels is true, the stream labels contains just the stream labels and entries inside each stream have their
// structuredMetadata and parsed fields populated with structured metadata labels plus the parsed labels respectively.
// Otherwise, the stream labels are the whole series labels including the stream labels, structured metadata labels and parsed labels.
-func streamsForFieldDetection(i iter.EntryIterator, size uint32, interval time.Duration) (logqlmodel.Streams, error) {
+func streamsForFieldDetection(i iter.EntryIterator, size uint32) (logqlmodel.Streams, error) {
streams := map[string]*logproto.Stream{}
respSize := uint32(0)
// lastEntry should be a really old time so that the first comparison is always true, we use a negative
@@ -1199,14 +1199,12 @@ func streamsForFieldDetection(i iter.EntryIterator, size uint32, interval time.D
for respSize < size && i.Next() {
streamLabels, entry := i.Labels(), i.Entry()
- // Always going backward
- shouldOutput := entry.Timestamp.Equal(lastEntry.Add(-interval)) ||
- entry.Timestamp.Before(lastEntry.Add(-interval))
+ // Always going backward as the direction for field detection is hard-coded to BACKWARD
+ shouldOutput := entry.Timestamp.Equal(lastEntry) || entry.Timestamp.Before(lastEntry)
- // If step == 0 output every line.
// If lastEntry.Unix < 0 this is the first pass through the loop and we should output the line.
// Then check to see if the entry is equal to, or past a forward step
- if interval == 0 || lastEntry.Unix() < 0 || shouldOutput {
+ if lastEntry.Unix() < 0 || shouldOutput {
stream, ok := streams[streamLabels]
if !ok {
stream = &logproto.Stream{
diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go
index 09997156128e..874313d49826 100644
--- a/pkg/querier/queryrange/codec.go
+++ b/pkg/querier/queryrange/codec.go
@@ -1610,7 +1610,7 @@ func (Codec) MergeResponse(responses ...queryrangebase.Response) (queryrangebase
return &DetectedFieldsResponse{
Response: &logproto.DetectedFieldsResponse{
Fields: mergedFields,
- FieldLimit: fieldLimit,
+ FieldLimit: 0,
},
Headers: headers,
}, nil
diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go
index 228f20a51405..e5b9db82cd27 100644
--- a/pkg/querier/queryrange/roundtrip.go
+++ b/pkg/querier/queryrange/roundtrip.go
@@ -11,6 +11,7 @@ import (
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/grafana/dskit/httpgrpc"
+ "github.com/grafana/dskit/tenant"
"github.com/grafana/dskit/user"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
@@ -21,12 +22,14 @@ import (
logqllog "github.com/grafana/loki/v3/pkg/logql/log"
"github.com/grafana/loki/v3/pkg/logql/syntax"
"github.com/grafana/loki/v3/pkg/logqlmodel/stats"
+ "github.com/grafana/loki/v3/pkg/querier/queryrange/queryrangebase"
base "github.com/grafana/loki/v3/pkg/querier/queryrange/queryrangebase"
"github.com/grafana/loki/v3/pkg/storage/chunk/cache"
"github.com/grafana/loki/v3/pkg/storage/config"
"github.com/grafana/loki/v3/pkg/util"
"github.com/grafana/loki/v3/pkg/util/constants"
logutil "github.com/grafana/loki/v3/pkg/util/log"
+ "github.com/grafana/loki/v3/pkg/util/validation"
)
const (
@@ -1132,12 +1135,14 @@ func NewDetectedFieldsTripperware(
return base.MiddlewareFunc(func(next base.Handler) base.Handler {
statsHandler := indexStatsTripperware.Wrap(next)
+ splitter := newDefaultSplitter(limits, iqo)
+
queryRangeMiddleware := []base.Middleware{
StatsCollectorMiddleware(),
NewLimitsMiddleware(limits),
NewQuerySizeLimiterMiddleware(schema.Configs, engineOpts, log, limits, statsHandler),
base.InstrumentMiddleware("split_by_interval", metrics.InstrumentMiddlewareMetrics),
- SplitByIntervalMiddleware(schema.Configs, limits, merger, newDefaultSplitter(limits, iqo), metrics.SplitByMetrics),
+ SplitByIntervalMiddleware(schema.Configs, limits, merger, splitter, metrics.SplitByMetrics),
}
// The sharding middleware takes care of enforcing this limit for both shardable and non-shardable queries.
@@ -1153,6 +1158,62 @@ func NewDetectedFieldsTripperware(
)
}
- return NewLimitedRoundTripper(next, limits, schema.Configs, queryRangeMiddleware...)
+ limitedRT := NewLimitedRoundTripper(next, limits, schema.Configs, queryRangeMiddleware...)
+ return NewSketchRemovingHandler(limitedRT, limits, splitter)
}), nil
}
+
+// NewSketchRemovingHandler returns a handler that removes sketches from detected fields responses before
+// returning them to the user. We only need sketches internally for calculating cardinality for split queries.
+// We're already doing this sanitization in the merge code, so this handler catches non-split queries
+// to make sure their sketches are also removed.
+func NewSketchRemovingHandler(next queryrangebase.Handler, limits Limits, splitter splitter) queryrangebase.Handler {
+ return queryrangebase.HandlerFunc(
+ func(ctx context.Context, req queryrangebase.Request) (queryrangebase.Response, error) {
+ res, err := next.Do(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ resp, ok := res.(*DetectedFieldsResponse)
+ if !ok {
+ return res, nil
+ }
+
+ tenantIDs, err := tenant.TenantIDs(ctx)
+ if err != nil {
+ return resp, nil
+ }
+
+ interval := validation.SmallestPositiveNonZeroDurationPerTenant(
+ tenantIDs,
+ limits.QuerySplitDuration,
+ )
+
+ // sketeches get cleaned up in the merge code, so we only need catch the cases
+ // where no splitting happened
+ if interval == 0 {
+ return removeSketches(resp), nil
+ }
+
+ intervals, err := splitter.split(time.Now().UTC(), tenantIDs, req, interval)
+ if err != nil || len(intervals) < 2 {
+ return removeSketches(resp), nil
+ }
+
+ // must have been splits, so sketches are already removed
+ return resp, nil
+ },
+ )
+}
+
+// removeSketches removes sketches and field limit from a detected fields response.
+// this is only needed for queries that were not split.
+func removeSketches(resp *DetectedFieldsResponse) *DetectedFieldsResponse {
+ for i := range resp.Response.Fields {
+ resp.Response.Fields[i].Sketch = nil
+ }
+
+ resp.Response.FieldLimit = 0
+ return resp
+}
diff --git a/pkg/storage/detected/fields.go b/pkg/storage/detected/fields.go
index b9e3c714d1ec..7ced040b37d2 100644
--- a/pkg/storage/detected/fields.go
+++ b/pkg/storage/detected/fields.go
@@ -73,18 +73,11 @@ func MergeFields(
result := make([]*logproto.DetectedField, 0, fieldLimit)
for _, field := range mergedFields {
- // TODO(twhitney): what's the performance cost of marshalling here? We technically don't need to marshal in the merge
- // but it's nice to keep the response consistent through middlewares in case we need the sketch somewhere else,
- // need to benchmark this to find out.
- sketch, err := field.Sketch.MarshalBinary()
- if err != nil {
- return nil, err
- }
detectedField := &logproto.DetectedField{
Label: field.Label,
Type: field.Type,
Cardinality: field.Sketch.Estimate(),
- Sketch: sketch,
+ Sketch: nil,
}
result = append(result, detectedField)
}
diff --git a/production/helm/loki/CHANGELOG.md b/production/helm/loki/CHANGELOG.md
index ad796a850c3b..d109756fdc74 100644
--- a/production/helm/loki/CHANGELOG.md
+++ b/production/helm/loki/CHANGELOG.md
@@ -13,6 +13,26 @@ Entries should include a reference to the pull request that introduced the chang
[//]: # ( : do not remove this line. This locator is used by the CI pipeline to automatically create a changelog entry for each new Loki release. Add other chart versions and respective changelog entries bellow this line.)
+## 6.3.3
+
+- [ENHANCEMENT] make the singlebinary set 0 the replicas number of backend, write,read.
+
+## 6.3.2
+
+- [BUGFIX] Missing password for Loki-Canary when loki.auth_enabled is true
+
+## 6.3.1
+
+- [BUGFIX] Fixed Typo in Ingester templates for zoneAwareReplication
+
+## 6.3.0
+
+- [CHANGE] Changed version of Grafana Enterprise Logs to v3.0.0
+
+## 6.2.5
+
+- [BUGFIX] Add missing toleration blocks to bloom components.
+
## 6.2.4
- [ENHANCEMENT] Activate the volume endpoint by default.
diff --git a/production/helm/loki/Chart.yaml b/production/helm/loki/Chart.yaml
index e8b160550bc9..176e87af7d8b 100644
--- a/production/helm/loki/Chart.yaml
+++ b/production/helm/loki/Chart.yaml
@@ -3,7 +3,7 @@ name: loki
description: Helm chart for Grafana Loki in simple, scalable mode
type: application
appVersion: 3.0.0
-version: 6.2.4
+version: 6.3.3
home: https://grafana.github.io/helm-charts
sources:
- https://github.com/grafana/loki
diff --git a/production/helm/loki/README.md b/production/helm/loki/README.md
index c892d1b4f364..b9ce79499a61 100644
--- a/production/helm/loki/README.md
+++ b/production/helm/loki/README.md
@@ -1,6 +1,6 @@
# loki
-![Version: 6.2.4](https://img.shields.io/badge/Version-6.2.4-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 3.0.0](https://img.shields.io/badge/AppVersion-3.0.0-informational?style=flat-square)
+![Version: 6.3.3](https://img.shields.io/badge/Version-6.3.3-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 3.0.0](https://img.shields.io/badge/AppVersion-3.0.0-informational?style=flat-square)
Helm chart for Grafana Loki in simple, scalable mode
diff --git a/production/helm/loki/src/helm-test/Dockerfile b/production/helm/loki/src/helm-test/Dockerfile
index cf4420a2a68d..48ff7e8a6a27 100644
--- a/production/helm/loki/src/helm-test/Dockerfile
+++ b/production/helm/loki/src/helm-test/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.3 as build
+FROM golang:1.22.2 as build
# build via Makefile target helm-test-image in root
# Makefile. Building from this directory will not be
diff --git a/production/helm/loki/templates/backend/statefulset-backend.yaml b/production/helm/loki/templates/backend/statefulset-backend.yaml
index 1b7ead3ae1ad..3deb4aa6b6c8 100644
--- a/production/helm/loki/templates/backend/statefulset-backend.yaml
+++ b/production/helm/loki/templates/backend/statefulset-backend.yaml
@@ -19,8 +19,12 @@ metadata:
{{- end }}
{{- end }}
spec:
-{{- if not .Values.backend.autoscaling.enabled }}
- replicas: {{ .Values.backend.replicas }}
+{{- if not .Values.write.autoscaling.enabled }}
+ {{- if eq .Values.deploymentMode "SingleBinary" }}
+ replicas: 0
+ {{- else }}
+ replicas: {{ .Values.write.replicas }}
+ {{- end }}
{{- end }}
podManagementPolicy: {{ .Values.backend.podManagementPolicy }}
updateStrategy:
diff --git a/production/helm/loki/templates/bloom-compactor/statefulset-bloom-compactor.yaml b/production/helm/loki/templates/bloom-compactor/statefulset-bloom-compactor.yaml
index fbece8f2953e..424fa4bb65d7 100644
--- a/production/helm/loki/templates/bloom-compactor/statefulset-bloom-compactor.yaml
+++ b/production/helm/loki/templates/bloom-compactor/statefulset-bloom-compactor.yaml
@@ -131,6 +131,10 @@ spec:
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
+ {{- with .Values.bloomCompactor.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
volumes:
- name: temp
emptyDir: {}
diff --git a/production/helm/loki/templates/bloom-gateway/statefulset-bloom-gateway.yaml b/production/helm/loki/templates/bloom-gateway/statefulset-bloom-gateway.yaml
index 353b0203fe79..e2ceefbeafb5 100644
--- a/production/helm/loki/templates/bloom-gateway/statefulset-bloom-gateway.yaml
+++ b/production/helm/loki/templates/bloom-gateway/statefulset-bloom-gateway.yaml
@@ -131,6 +131,10 @@ spec:
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
+ {{- with .Values.bloomGateway.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
volumes:
- name: temp
emptyDir: {}
diff --git a/production/helm/loki/templates/ingester/statefulset-ingester-zone-b.yaml b/production/helm/loki/templates/ingester/statefulset-ingester-zone-b.yaml
index a0c7b85f8a14..3af81ae6477e 100644
--- a/production/helm/loki/templates/ingester/statefulset-ingester-zone-b.yaml
+++ b/production/helm/loki/templates/ingester/statefulset-ingester-zone-b.yaml
@@ -168,10 +168,10 @@ spec:
values:
- ingester-zone-b
topologyKey: kubernetes.io/hostname
- {{- with .Values.ingester.zoneAwareReplication.zoneA.extraAffinity }}
+ {{- with .Values.ingester.zoneAwareReplication.zoneB.extraAffinity }}
{{- toYaml . | nindent 8 }}
{{- end }}
- {{- with .Values.ingester.zoneAwareReplication.zoneA.nodeSelector }}
+ {{- with .Values.ingester.zoneAwareReplication.zoneB.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
diff --git a/production/helm/loki/templates/ingester/statefulset-ingester-zone-c.yaml b/production/helm/loki/templates/ingester/statefulset-ingester-zone-c.yaml
index cc65f49b244c..30393fa4d2ca 100644
--- a/production/helm/loki/templates/ingester/statefulset-ingester-zone-c.yaml
+++ b/production/helm/loki/templates/ingester/statefulset-ingester-zone-c.yaml
@@ -168,10 +168,10 @@ spec:
values:
- ingester-zone-c
topologyKey: kubernetes.io/hostname
- {{- with .Values.ingester.zoneAwareReplication.zoneA.extraAffinity }}
+ {{- with .Values.ingester.zoneAwareReplication.zoneC.extraAffinity }}
{{- toYaml . | nindent 8 }}
{{- end }}
- {{- with .Values.ingester.zoneAwareReplication.zoneA.nodeSelector }}
+ {{- with .Values.ingester.zoneAwareReplication.zoneC.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
diff --git a/production/helm/loki/templates/loki-canary/daemonset.yaml b/production/helm/loki/templates/loki-canary/daemonset.yaml
index e9998dcef67f..dc5c6296891c 100644
--- a/production/helm/loki/templates/loki-canary/daemonset.yaml
+++ b/production/helm/loki/templates/loki-canary/daemonset.yaml
@@ -51,6 +51,7 @@ spec:
{{- else if $.Values.loki.auth_enabled }}
- -user={{ $.Values.monitoring.selfMonitoring.tenant.name }}
- -tenant-id={{ $.Values.monitoring.selfMonitoring.tenant.name }}
+ - -pass={{ $.Values.monitoring.selfMonitoring.tenant.password }}
{{- end }}
{{- if .push }}
- -push=true
diff --git a/production/helm/loki/templates/read/statefulset-read.yaml b/production/helm/loki/templates/read/statefulset-read.yaml
index 46d163442cc9..29d79c7d0c78 100644
--- a/production/helm/loki/templates/read/statefulset-read.yaml
+++ b/production/helm/loki/templates/read/statefulset-read.yaml
@@ -19,8 +19,12 @@ metadata:
{{- end }}
{{- end }}
spec:
-{{- if not .Values.read.autoscaling.enabled }}
- replicas: {{ .Values.read.replicas }}
+{{- if not .Values.write.autoscaling.enabled }}
+ {{- if eq .Values.deploymentMode "SingleBinary" }}
+ replicas: 0
+ {{- else }}
+ replicas: {{ .Values.write.replicas }}
+ {{- end }}
{{- end }}
podManagementPolicy: {{ .Values.read.podManagementPolicy }}
updateStrategy:
diff --git a/production/helm/loki/templates/write/statefulset-write.yaml b/production/helm/loki/templates/write/statefulset-write.yaml
index 0c89cde090ab..54c936958b55 100644
--- a/production/helm/loki/templates/write/statefulset-write.yaml
+++ b/production/helm/loki/templates/write/statefulset-write.yaml
@@ -20,7 +20,11 @@ metadata:
{{- end }}
spec:
{{- if not .Values.write.autoscaling.enabled }}
+ {{- if eq .Values.deploymentMode "SingleBinary" }}
+ replicas: 0
+ {{- else }}
replicas: {{ .Values.write.replicas }}
+ {{- end }}
{{- end }}
podManagementPolicy: {{ .Values.write.podManagementPolicy }}
updateStrategy:
diff --git a/production/helm/loki/values.yaml b/production/helm/loki/values.yaml
index d9561ef72f84..855e75c551fd 100644
--- a/production/helm/loki/values.yaml
+++ b/production/helm/loki/values.yaml
@@ -18,7 +18,6 @@ fullnameOverride: null
clusterLabelOverride: null
# -- Image pull secrets for Docker images
imagePullSecrets: []
-
# -- Deployment mode lets you specify how to deploy Loki.
# There are 3 options:
# - SingleBinary: Loki is deployed as a single binary, useful for small installs typically without HA, up to a few tens of GB/day.
@@ -29,7 +28,6 @@ imagePullSecrets: []
# - SimpleScalable<->Distributed: Migrate from SimpleScalable to Distributed (or vice versa)
# Note: SimpleScalable and Distributed REQUIRE the use of object storage.
deploymentMode: SimpleScalable
-
######################################################################################################################
#
# Base Loki Configs including kubernetes configurations and configurations for Loki itself,
@@ -111,12 +109,10 @@ loki:
# In order to move sensitive information (such as credentials) from the ConfigMap/Secret to a more secure location (e.g. vault), it is possible to use [environment variables in the configuration](https://grafana.com/docs/loki/latest/configuration/#use-environment-variables-in-the-configuration).
# Such environment variables can be then stored in a separate Secret and injected via the global.extraEnvFrom value. For details about environment injection from a Secret please see [Secrets](https://kubernetes.io/docs/concepts/configuration/secret/#use-case-as-container-environment-variables).
configStorageType: ConfigMap
-
# -- The name of the object which Loki will mount as a volume containing the config.
# If the configStorageType is Secret, this will be the name of the Secret, if it is ConfigMap, this will be the name of the ConfigMap.
# The value will be passed through tpl.
configObjectName: '{{ include "loki.name" . }}'
-
# -- The name of the Secret or ConfigMap that will be created by this chart.
# If empty, no configmap or secret will be created.
# The value will be passed through tpl.
@@ -442,7 +438,6 @@ loki:
# -- Enable tracing
tracing:
enabled: false
-
######################################################################################################################
#
# Enterprise Loki Configs
@@ -454,7 +449,7 @@ enterprise:
# Enable enterprise features, license must be provided
enabled: false
# Default verion of GEL to deploy
- version: v1.8.6
+ version: v3.0.0
# -- Optional name of the GEL cluster, otherwise will use .Release.Name
# The cluster name must match what is in your GEL license
cluster_name: null
@@ -596,7 +591,6 @@ kubectlImage:
digest: null
# -- Docker image pull policy
pullPolicy: IfNotPresent
-
######################################################################################################################
#
# Chart Testing
@@ -685,13 +679,11 @@ lokiCanary:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
-
######################################################################################################################
#
# Service Accounts and Kubernetes RBAC
#
######################################################################################################################
-
serviceAccount:
# -- Specifies whether a ServiceAccount should be created
create: true
@@ -720,13 +712,11 @@ rbac:
# apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
# -- Whether to install RBAC in the namespace only or cluster-wide. Useful if you want to watch ConfigMap globally.
namespaced: false
-
######################################################################################################################
#
# Network Policy configuration
#
######################################################################################################################
-
networkPolicy:
# -- Specifies whether Network Policies should be created
enabled: false
@@ -776,7 +766,6 @@ networkPolicy:
egressKubeApiserver:
# -- Enable additional cilium egress rules to kube-apiserver for backend.
enabled: false
-
######################################################################################################################
#
# Global memberlist configuration
@@ -787,7 +776,6 @@ networkPolicy:
memberlist:
service:
publishNotReadyAddresses: false
-
######################################################################################################################
#
# adminAPI configuration, enterprise only.
@@ -857,6 +845,7 @@ adminApi:
# -- Grace period to allow the admin-api to shutdown before it is killed
terminationGracePeriodSeconds: 60
+
######################################################################################################################
#
# Gateway and Ingress
@@ -1025,9 +1014,11 @@ gateway:
htpasswd: >-
{{ if .Values.loki.tenants }}
+
{{- range $t := .Values.loki.tenants }}
{{ htpasswd (required "All tenants must have a 'name' set" $t.name) (required "All tenants must have a 'password' set" $t.password) }}
+
{{- end }}
{{ else }} {{ htpasswd (required "'gateway.basicAuth.username' is required" .Values.gateway.basicAuth.username) (required "'gateway.basicAuth.password' is required" .Values.gateway.basicAuth.password) }} {{ end }}
# -- Existing basic auth secret to use. Must contain '.htpasswd'
@@ -1068,7 +1059,6 @@ gateway:
# @default -- See values.yaml
file: |
{{- include "loki.nginxFile" . | indent 2 -}}
-
# -- If running enterprise and using the default enterprise gateway, configs go here.
enterpriseGateway:
# -- Define the amount of instances
@@ -1134,7 +1124,6 @@ enterpriseGateway:
tolerations: []
# -- Grace period to allow the gateway to shutdown before it is killed
terminationGracePeriodSeconds: 60
-
# -- Ingress configuration Use either this ingress or the gateway, but not both at once.
# If you enable this, make sure to disable the gateway.
# You'll need to supply authn configuration for your ingress controller.
@@ -1291,7 +1280,6 @@ singleBinary:
storageClass: null
# -- Selector for persistent disk
selector: null
-
######################################################################################################################
#
# Simple Scalable Deployment (SSD) Mode
@@ -1419,7 +1407,6 @@ write:
storageClass: null
# -- Selector for persistent disk
selector: null
-
# -- Configuration for the read pod(s)
read:
# -- Number of replicas for the read
@@ -1527,7 +1514,6 @@ read:
storageClass: null
# -- Selector for persistent disk
selector: null
-
# -- Configuration for the backend pod(s)
backend:
# -- Number of replicas for the backend
@@ -1636,7 +1622,6 @@ backend:
storageClass: null
# -- Selector for persistent disk
selector: null
-
######################################################################################################################
#
# Microservices Mode
@@ -1765,8 +1750,8 @@ ingester:
# If empty or set to null, no storageClassName spec is
# set, choosing the default provisioner (gp2 on AWS, standard on GKE, AWS, and OpenStack).
storageClass: null
- # - name: wal
- # size: 150Gi
+ # - name: wal
+ # size: 150Gi
# -- Enable StatefulSetAutoDeletePVC feature
enableStatefulSetAutoDeletePVC: false
whenDeleted: Retain
@@ -1821,7 +1806,6 @@ ingester:
excludeDefaultZone: false
readPath: false
writePath: false
-
# -- Configuration for the distributor
distributor:
# -- Number of replicas for the distributor
@@ -1908,11 +1892,10 @@ distributor:
nodeSelector: {}
# -- Tolerations for distributor pods
tolerations: []
- # -- Adds the appProtocol field to the distributor service. This allows distributor to work with istio protocol selection.
+ # -- Adds the appProtocol field to the distributor service. This allows distributor to work with istio protocol selection.
appProtocol:
# -- Set the optional grpc service protocol. Ex: "grpc", "http2" or "https"
grpc: ""
-
# -- Configuration for the querier
querier:
# -- Number of replicas for the querier
@@ -2029,7 +2012,6 @@ querier:
appProtocol:
# -- Set the optional grpc service protocol. Ex: "grpc", "http2" or "https"
grpc: ""
-
# -- Configuration for the query-frontend
queryFrontend:
# -- Number of replicas for the query-frontend
@@ -2118,7 +2100,6 @@ queryFrontend:
appProtocol:
# -- Set the optional grpc service protocol. Ex: "grpc", "http2" or "https"
grpc: ""
-
# -- Configuration for the query-scheduler
queryScheduler:
# -- Number of replicas for the query-scheduler.
@@ -2179,7 +2160,6 @@ queryScheduler:
# -- Set the optional grpc service protocol. Ex: "grpc", "http2" or "https"
appProtocol:
grpc: ""
-
# -- Configuration for the index-gateway
indexGateway:
# -- Number of replicas for the index-gateway
@@ -2261,7 +2241,6 @@ indexGateway:
# -- Set the optional grpc service protocol. Ex: "grpc", "http2" or "https"
appProtocol:
grpc: ""
-
# -- Configuration for the compactor
compactor:
# -- Number of replicas for the compactor
@@ -2350,13 +2329,12 @@ compactor:
# If empty or set to null, no storageClassName spec is
# set, choosing the default provisioner (gp2 on AWS, standard on GKE, AWS, and OpenStack).
storageClass: null
- # - name: wal
- # size: 150Gi
+ # - name: wal
+ # size: 150Gi
# -- Enable StatefulSetAutoDeletePVC feature
enableStatefulSetAutoDeletePVC: false
whenDeleted: Retain
whenScaled: Retain
-
serviceAccount:
create: false
# -- The name of the ServiceAccount to use for the compactor.
@@ -2369,7 +2347,6 @@ compactor:
annotations: {}
# -- Set this toggle to false to opt out of automounting API credentials for the service account
automountServiceAccountToken: true
-
# -- Configuration for the bloom gateway
bloomGateway:
# -- Number of replicas for the bloom gateway
@@ -2458,13 +2435,12 @@ bloomGateway:
# If empty or set to null, no storageClassName spec is
# set, choosing the default provisioner (gp2 on AWS, standard on GKE, AWS, and OpenStack).
storageClass: null
- # - name: wal
- # size: 150Gi
+ # - name: wal
+ # size: 150Gi
# -- Enable StatefulSetAutoDeletePVC feature
enableStatefulSetAutoDeletePVC: false
whenDeleted: Retain
whenScaled: Retain
-
serviceAccount:
create: false
# -- The name of the ServiceAccount to use for the bloom gateway.
@@ -2477,7 +2453,6 @@ bloomGateway:
annotations: {}
# -- Set this toggle to false to opt out of automounting API credentials for the service account
automountServiceAccountToken: true
-
# -- Configuration for the bloom compactor
bloomCompactor:
# -- Number of replicas for the bloom compactor
@@ -2566,13 +2541,12 @@ bloomCompactor:
# If empty or set to null, no storageClassName spec is
# set, choosing the default provisioner (gp2 on AWS, standard on GKE, AWS, and OpenStack).
storageClass: null
- # - name: wal
- # size: 150Gi
+ # - name: wal
+ # size: 150Gi
# -- Enable StatefulSetAutoDeletePVC feature
enableStatefulSetAutoDeletePVC: false
whenDeleted: Retain
whenScaled: Retain
-
serviceAccount:
create: false
# -- The name of the ServiceAccount to use for the bloom compactor.
@@ -2585,7 +2559,6 @@ bloomCompactor:
annotations: {}
# -- Set this toggle to false to opt out of automounting API credentials for the service account
automountServiceAccountToken: true
-
# -- Configuration for the pattern ingester
patternIngester:
# -- Number of replicas for the pattern ingester
@@ -2674,13 +2647,12 @@ patternIngester:
# If empty or set to null, no storageClassName spec is
# set, choosing the default provisioner (gp2 on AWS, standard on GKE, AWS, and OpenStack).
storageClass: null
- # - name: wal
- # size: 150Gi
+ # - name: wal
+ # size: 150Gi
# -- Enable StatefulSetAutoDeletePVC feature
enableStatefulSetAutoDeletePVC: false
whenDeleted: Retain
whenScaled: Retain
-
serviceAccount:
create: false
# -- The name of the ServiceAccount to use for the pattern ingester.
@@ -2693,7 +2665,6 @@ patternIngester:
annotations: {}
# -- Set this toggle to false to opt out of automounting API credentials for the service account
automountServiceAccountToken: true
-
# -- Configuration for the ruler
ruler:
# -- The ruler component is optional and can be disabled if desired.
@@ -2775,71 +2746,70 @@ ruler:
grpc: ""
# -- Directories containing rules files
directories: {}
- # tenant_foo:
- # rules1.txt: |
- # groups:
- # - name: should_fire
- # rules:
- # - alert: HighPercentageError
- # expr: |
- # sum(rate({app="foo", env="production"} |= "error" [5m])) by (job)
- # /
- # sum(rate({app="foo", env="production"}[5m])) by (job)
- # > 0.05
- # for: 10m
- # labels:
- # severity: warning
- # annotations:
- # summary: High error rate
- # - name: credentials_leak
- # rules:
- # - alert: http-credentials-leaked
- # annotations:
- # message: "{{ $labels.job }} is leaking http basic auth credentials."
- # expr: 'sum by (cluster, job, pod) (count_over_time({namespace="prod"} |~ "http(s?)://(\\w+):(\\w+)@" [5m]) > 0)'
- # for: 10m
- # labels:
- # severity: critical
- # rules2.txt: |
- # groups:
- # - name: example
- # rules:
- # - alert: HighThroughputLogStreams
- # expr: sum by(container) (rate({job=~"loki-dev/.*"}[1m])) > 1000
- # for: 2m
- # tenant_bar:
- # rules1.txt: |
- # groups:
- # - name: should_fire
- # rules:
- # - alert: HighPercentageError
- # expr: |
- # sum(rate({app="foo", env="production"} |= "error" [5m])) by (job)
- # /
- # sum(rate({app="foo", env="production"}[5m])) by (job)
- # > 0.05
- # for: 10m
- # labels:
- # severity: warning
- # annotations:
- # summary: High error rate
- # - name: credentials_leak
- # rules:
- # - alert: http-credentials-leaked
- # annotations:
- # message: "{{ $labels.job }} is leaking http basic auth credentials."
- # expr: 'sum by (cluster, job, pod) (count_over_time({namespace="prod"} |~ "http(s?)://(\\w+):(\\w+)@" [5m]) > 0)'
- # for: 10m
- # labels:
- # severity: critical
- # rules2.txt: |
- # groups:
- # - name: example
- # rules:
- # - alert: HighThroughputLogStreams
- # expr: sum by(container) (rate({job=~"loki-dev/.*"}[1m])) > 1000
- # for: 2m
-
+ # tenant_foo:
+ # rules1.txt: |
+ # groups:
+ # - name: should_fire
+ # rules:
+ # - alert: HighPercentageError
+ # expr: |
+ # sum(rate({app="foo", env="production"} |= "error" [5m])) by (job)
+ # /
+ # sum(rate({app="foo", env="production"}[5m])) by (job)
+ # > 0.05
+ # for: 10m
+ # labels:
+ # severity: warning
+ # annotations:
+ # summary: High error rate
+ # - name: credentials_leak
+ # rules:
+ # - alert: http-credentials-leaked
+ # annotations:
+ # message: "{{ $labels.job }} is leaking http basic auth credentials."
+ # expr: 'sum by (cluster, job, pod) (count_over_time({namespace="prod"} |~ "http(s?)://(\\w+):(\\w+)@" [5m]) > 0)'
+ # for: 10m
+ # labels:
+ # severity: critical
+ # rules2.txt: |
+ # groups:
+ # - name: example
+ # rules:
+ # - alert: HighThroughputLogStreams
+ # expr: sum by(container) (rate({job=~"loki-dev/.*"}[1m])) > 1000
+ # for: 2m
+ # tenant_bar:
+ # rules1.txt: |
+ # groups:
+ # - name: should_fire
+ # rules:
+ # - alert: HighPercentageError
+ # expr: |
+ # sum(rate({app="foo", env="production"} |= "error" [5m])) by (job)
+ # /
+ # sum(rate({app="foo", env="production"}[5m])) by (job)
+ # > 0.05
+ # for: 10m
+ # labels:
+ # severity: warning
+ # annotations:
+ # summary: High error rate
+ # - name: credentials_leak
+ # rules:
+ # - alert: http-credentials-leaked
+ # annotations:
+ # message: "{{ $labels.job }} is leaking http basic auth credentials."
+ # expr: 'sum by (cluster, job, pod) (count_over_time({namespace="prod"} |~ "http(s?)://(\\w+):(\\w+)@" [5m]) > 0)'
+ # for: 10m
+ # labels:
+ # severity: critical
+ # rules2.txt: |
+ # groups:
+ # - name: example
+ # rules:
+ # - alert: HighThroughputLogStreams
+ # expr: sum by(container) (rate({job=~"loki-dev/.*"}[1m])) > 1000
+ # for: 2m
memcached:
image:
# -- Memcached Docker image repository
@@ -2858,7 +2828,6 @@ memcached:
capabilities:
drop: [ALL]
allowPrivilegeEscalation: false
-
memcachedExporter:
# -- Whether memcached metrics should be exported
enabled: true
@@ -2885,7 +2854,6 @@ memcachedExporter:
# memcached.tls.insecure-skip-verify: false
# memcached.tls.server-name: memcached
extraArgs: {}
-
resultsCache:
# -- Specifies whether memcached based results-cache should be enabled
enabled: true
@@ -2970,7 +2938,6 @@ resultsCache:
service:
annotations: {}
labels: {}
-
chunksCache:
# -- Specifies whether memcached based chunks-cache should be enabled
enabled: true
@@ -3059,7 +3026,6 @@ chunksCache:
service:
annotations: {}
labels: {}
-
######################################################################################################################
#
# Subchart configurations
@@ -3068,7 +3034,6 @@ chunksCache:
# -- Setting for the Grafana Rollout Operator https://github.com/grafana/helm-charts/tree/main/charts/rollout-operator
rollout_operator:
enabled: false
-
# -- podSecurityContext is the pod security context for the rollout operator.
# When installing on OpenShift, override podSecurityContext settings with
#
@@ -3084,14 +3049,12 @@ rollout_operator:
runAsUser: 10001
seccompProfile:
type: RuntimeDefault
-
# Set the container security context
securityContext:
readOnlyRootFilesystem: true
capabilities:
drop: [ALL]
allowPrivilegeEscalation: false
-
# -- Configuration for the minio subchart
minio:
enabled: false
@@ -3199,7 +3162,6 @@ sidecar:
watchClientTimeout: 60
# -- Log level of the sidecar container.
logLevel: INFO
-
############################################## WARNING ###############################################################
#
# DEPRECATED VALUES
@@ -3299,6 +3261,8 @@ monitoring:
tenant:
# -- Name of the tenant
name: "self-monitoring"
+ # -- Password of the gateway for Basic auth
+ password: null
# -- Namespace to create additional tenant token secret in. Useful if your Grafana instance
# is in a separate namespace. Token will still be created in the canary namespace.
secretNamespace: "{{ .Release.Namespace }}"
@@ -3347,7 +3311,6 @@ monitoring:
labels: {}
# -- Additional clients for remote write
clients: null
-
# -- DEPRECATED Configuration for the table-manager. The table-manager is only necessary when using a deprecated
# index type such as Cassandra, Bigtable, or DynamoDB, it has not been necessary since loki introduced self-
# contained index types like 'boltdb-shipper' and 'tsdb'. This will be removed in a future helm chart.
diff --git a/production/loki-mixin-compiled-ssd/dashboards/loki-logs.json b/production/loki-mixin-compiled-ssd/dashboards/loki-logs.json
index 27fc922838ef..32b8e52ad011 100644
--- a/production/loki-mixin-compiled-ssd/dashboards/loki-logs.json
+++ b/production/loki-mixin-compiled-ssd/dashboards/loki-logs.json
@@ -801,7 +801,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$deployment.*\", pod=~\"$pod\", container=~\"$container\" } |logfmt| level=\"$level\" |= \"$filter\" | __error__=\"\" [$__rate_interval])) by (level)",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$deployment.*\", pod=~\"$pod\", container=~\"$container\" } |logfmt| level=\"$level\" |= \"$filter\" | __error__=\"\" [$__auto])) by (level)",
"intervalFactor": 3,
"legendFormat": "{{level}}",
"refId": "A"
diff --git a/production/loki-mixin-compiled-ssd/dashboards/loki-operational.json b/production/loki-mixin-compiled-ssd/dashboards/loki-operational.json
index fbaf16610f64..9914c29aada4 100644
--- a/production/loki-mixin-compiled-ssd/dashboards/loki-operational.json
+++ b/production/loki-mixin-compiled-ssd/dashboards/loki-operational.json
@@ -1997,7 +1997,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/(loki|enterprise-logs)-write\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/(loki|enterprise-logs)-write\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
@@ -3224,7 +3224,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/(loki|enterprise-logs)-read\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/(loki|enterprise-logs)-read\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
diff --git a/production/loki-mixin-compiled/dashboards/loki-logs.json b/production/loki-mixin-compiled/dashboards/loki-logs.json
index 27fc922838ef..32b8e52ad011 100644
--- a/production/loki-mixin-compiled/dashboards/loki-logs.json
+++ b/production/loki-mixin-compiled/dashboards/loki-logs.json
@@ -801,7 +801,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$deployment.*\", pod=~\"$pod\", container=~\"$container\" } |logfmt| level=\"$level\" |= \"$filter\" | __error__=\"\" [$__rate_interval])) by (level)",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$deployment.*\", pod=~\"$pod\", container=~\"$container\" } |logfmt| level=\"$level\" |= \"$filter\" | __error__=\"\" [$__auto])) by (level)",
"intervalFactor": 3,
"legendFormat": "{{level}}",
"refId": "A"
diff --git a/production/loki-mixin-compiled/dashboards/loki-operational.json b/production/loki-mixin-compiled/dashboards/loki-operational.json
index 394b720be16b..d677775d52ef 100644
--- a/production/loki-mixin-compiled/dashboards/loki-operational.json
+++ b/production/loki-mixin-compiled/dashboards/loki-operational.json
@@ -2094,7 +2094,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/distributor\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/distributor\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
@@ -2787,7 +2787,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/ingester.*\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/ingester.*\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
@@ -3732,7 +3732,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/querier\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=~\"($namespace)/querier\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
diff --git a/production/loki-mixin/alerts.libsonnet b/production/loki-mixin/alerts.libsonnet
index 089ed7439da3..5bff18e72c6e 100644
--- a/production/loki-mixin/alerts.libsonnet
+++ b/production/loki-mixin/alerts.libsonnet
@@ -57,17 +57,17 @@
{
alert: 'LokiTooManyCompactorsRunning',
expr: |||
- sum(loki_boltdb_shipper_compactor_running) by (namespace, cluster) > 1
- |||,
+ sum(loki_boltdb_shipper_compactor_running) by (namespace, %s) > 1
+ ||| % $._config.per_cluster_label,
'for': '5m',
labels: {
severity: 'warning',
},
annotations: {
summary: 'Loki deployment is running more than one compactor.',
- description: |||
+ description: std.strReplace(|||
{{ $labels.cluster }} {{ $labels.namespace }} has had {{ printf "%.0f" $value }} compactors running for more than 5m. Only one compactor should run at a time.
- |||,
+ |||, 'cluster', $._config.per_cluster_label),
},
},
],
diff --git a/production/loki-mixin/dashboards/dashboard-loki-logs.json b/production/loki-mixin/dashboards/dashboard-loki-logs.json
index 6999a5389f9d..72b8565e3c70 100644
--- a/production/loki-mixin/dashboards/dashboard-loki-logs.json
+++ b/production/loki-mixin/dashboards/dashboard-loki-logs.json
@@ -803,7 +803,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$deployment.*\", pod=~\"$pod\", container=~\"$container\" } |logfmt| level=\"$level\" |= \"$filter\" | __error__=\"\" [$__rate_interval])) by (level)",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", pod=~\"$deployment.*\", pod=~\"$pod\", container=~\"$container\" } |logfmt| level=\"$level\" |= \"$filter\" | __error__=\"\" [$__auto])) by (level)",
"intervalFactor": 3,
"legendFormat": "{{level}}",
"refId": "A"
diff --git a/production/loki-mixin/dashboards/dashboard-loki-operational.json b/production/loki-mixin/dashboards/dashboard-loki-operational.json
index 674e9ae21de5..3f215c2e9083 100644
--- a/production/loki-mixin/dashboards/dashboard-loki-operational.json
+++ b/production/loki-mixin/dashboards/dashboard-loki-operational.json
@@ -2077,7 +2077,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=\"$namespace/distributor\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=\"$namespace/distributor\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
@@ -2761,7 +2761,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=\"$namespace/ingester\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=\"$namespace/ingester\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
@@ -3692,7 +3692,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=\"$namespace/querier\"} | logfmt | level=\"error\"[$__rate_interval]))",
+ "expr": "sum(rate({cluster=\"$cluster\", namespace=\"$namespace\", job=\"$namespace/querier\"} | logfmt | level=\"error\"[$__auto]))",
"refId": "A"
}
],
diff --git a/production/loki-mixin/dashboards/loki-canary-dashboard.libsonnet b/production/loki-mixin/dashboards/loki-canary-dashboard.libsonnet
index 6539a34d77e4..94e07deb236b 100644
--- a/production/loki-mixin/dashboards/loki-canary-dashboard.libsonnet
+++ b/production/loki-mixin/dashboards/loki-canary-dashboard.libsonnet
@@ -24,8 +24,8 @@ local grafana = import 'grafonnet/grafana.libsonnet';
// This logic is inherited from mimir-mixin.
dashboard.dashboard('Canary')
// We can't make use of simplified template selectors from the loki dashboard utils until we port the cortex dashboard utils panel/grid functionality.
- .addTemplate('cluster', 'loki_build_info', 'cluster')
- .addTemplate('namespace', 'loki_build_info{cluster=~"$cluster"}', 'namespace')
+ .addTemplate('cluster', 'loki_build_info', $._config.per_cluster_label)
+ .addTemplate('namespace', 'loki_build_info{' + $._config.per_cluster_label + '=~"$cluster"}', 'namespace')
+ {
// This dashboard uses the new grid system in order to place panels (using gridPos).
// Because of this we can't use the mixin's addRow() and addPanel().
@@ -33,7 +33,7 @@ local grafana = import 'grafonnet/grafana.libsonnet';
rows: null,
// ugly hack, copy pasta the tag/link
// code from the loki-mixin
- tags: ['loki'],
+ tags: $._config.tags,
links: [
{
asDropdown: true,
@@ -49,60 +49,60 @@ local grafana = import 'grafonnet/grafana.libsonnet';
panels: [
// grid row 1
dashboard.panel('Canary Entries Total') +
- dashboard.newStatPanel('sum(count(loki_canary_entries_total{cluster=~"$cluster",namespace=~"$namespace"}))', unit='short') +
+ dashboard.newStatPanel('sum(count(loki_canary_entries_total{' + $._config.per_cluster_label + '=~"$cluster", namespace=~"$namespace"}))', unit='short') +
{ gridPos: { h: 4, w: 3, x: 0, y: 0 } },
dashboard.panel('Canary Logs Total') +
- dashboard.newStatPanel('sum(increase(loki_canary_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
+ dashboard.newStatPanel('sum(increase(loki_canary_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
{ gridPos: { h: 4, w: 3, x: 3, y: 0 } },
dashboard.panel('Missing') +
- dashboard.newStatPanel('sum(increase(loki_canary_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
+ dashboard.newStatPanel('sum(increase(loki_canary_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
{ gridPos: { h: 4, w: 3, x: 6, y: 0 } },
dashboard.panel('Spotcheck Missing') +
- dashboard.newStatPanel('sum(increase(loki_canary_spot_check_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
+ dashboard.newStatPanel('sum(increase(loki_canary_spot_check_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
{ gridPos: { h: 4, w: 3, x: 9, y: 0 } },
// grid row 2
dashboard.panel('Spotcheck Total') +
- dashboard.newStatPanel('sum(increase(loki_canary_spot_check_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
+ dashboard.newStatPanel('sum(increase(loki_canary_spot_check_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
{ gridPos: { h: 4, w: 3, x: 0, y: 4 } },
dashboard.panel('Metric Test Error %') +
- dashboard.newStatPanel('((sum(loki_canary_metric_test_expected{cluster=~"$cluster",namespace=~"$namespace"}) - sum(loki_canary_metric_test_actual{cluster=~"$cluster",namespace=~"$namespace"}))/(sum(loki_canary_metric_test_actual{cluster=~"$cluster",namespace=~"$namespace"}))) * 100') +
+ dashboard.newStatPanel('((sum(loki_canary_metric_test_expected{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}) - sum(loki_canary_metric_test_actual{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}))/(sum(loki_canary_metric_test_actual{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}))) * 100') +
{ gridPos: { h: 4, w: 3, x: 3, y: 4 } },
dashboard.panel('Missing %') +
- dashboard.newStatPanel('(sum(increase(loki_canary_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))/sum(increase(loki_canary_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range])))*100') +
+ dashboard.newStatPanel('(sum(increase(loki_canary_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))/sum(increase(loki_canary_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range])))*100') +
{ gridPos: { h: 4, w: 3, x: 6, y: 4 } },
dashboard.panel('Spotcheck Missing %') +
- dashboard.newStatPanel('(sum(increase(loki_canary_spot_check_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))/sum(increase(loki_canary_spot_check_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))) * 100') +
+ dashboard.newStatPanel('(sum(increase(loki_canary_spot_check_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))/sum(increase(loki_canary_spot_check_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))) * 100') +
{ gridPos: { h: 4, w: 3, x: 9, y: 4 } },
// grid row 3
dashboard.panel('Metric Test Expected') +
- dashboard.newStatPanel('sum(loki_canary_metric_test_expected{cluster=~"$cluster",namespace=~"$namespace"})', unit='short') +
+ dashboard.newStatPanel('sum(loki_canary_metric_test_expected{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"})', unit='short') +
{ gridPos: { h: 4, w: 3, x: 0, y: 8 } },
dashboard.panel('Metric Test Actual') +
- dashboard.newStatPanel('sum(loki_canary_metric_test_actual{cluster=~"$cluster",namespace=~"$namespace"})', unit='short') +
+ dashboard.newStatPanel('sum(loki_canary_metric_test_actual{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"})', unit='short') +
{ gridPos: { h: 4, w: 3, x: 3, y: 8 } },
dashboard.panel('Websocket Missing') +
- dashboard.newStatPanel('sum(increase(loki_canary_websocket_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
+ dashboard.newStatPanel('sum(increase(loki_canary_websocket_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))', unit='short') +
{ gridPos: { h: 4, w: 3, x: 6, y: 8 } },
dashboard.panel('Websocket Missing %') +
- dashboard.newStatPanel('(sum(increase(loki_canary_websocket_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range]))/sum(increase(loki_canary_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__range])))*100') +
+ dashboard.newStatPanel('(sum(increase(loki_canary_websocket_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range]))/sum(increase(loki_canary_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__range])))*100') +
{ gridPos: { h: 4, w: 3, x: 9, y: 8 } },
// end of grid
dashboard.panel('Log Write to read Latency Percentiles') +
dashboard.queryPanel([
- 'histogram_quantile(0.95, sum(rate(loki_canary_response_latency_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
- 'histogram_quantile(0.50, sum(rate(loki_canary_response_latency_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
+ 'histogram_quantile(0.95, sum(rate(loki_canary_response_latency_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
+ 'histogram_quantile(0.50, sum(rate(loki_canary_response_latency_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
], ['p95', 'p50']) +
{ gridPos: { h: 6, w: 12, x: 12, y: 0 } },
@@ -115,7 +115,7 @@ local grafana = import 'grafonnet/grafana.libsonnet';
).addTargets(
[
grafana.prometheus.target(
- 'sum(rate(loki_canary_response_latency_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le)',
+ 'sum(rate(loki_canary_response_latency_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le)',
legendFormat='{{le}}',
format='heatmap',
),
@@ -125,24 +125,24 @@ local grafana = import 'grafonnet/grafana.libsonnet';
dashboard.panel('Spot Check Query') +
dashboard.queryPanel([
- 'histogram_quantile(0.99, sum(rate(loki_canary_spot_check_request_duration_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
- 'histogram_quantile(0.50, sum(rate(loki_canary_spot_check_request_duration_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
+ 'histogram_quantile(0.99, sum(rate(loki_canary_spot_check_request_duration_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
+ 'histogram_quantile(0.50, sum(rate(loki_canary_spot_check_request_duration_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) by (le))',
], ['p99', 'p95']) +
{ gridPos: { h: 6, w: 12, x: 0, y: 14 } },
dashboard.panel('Metric Test Query') +
dashboard.queryPanel([
- 'histogram_quantile(0.99, sum(rate(loki_canary_metric_test_request_duration_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[15m])) by (le))',
- 'histogram_quantile(0.50, sum(rate(loki_canary_metric_test_request_duration_seconds_bucket{cluster=~"$cluster",namespace=~"$namespace"}[15m])) by (le))',
+ 'histogram_quantile(0.99, sum(rate(loki_canary_metric_test_request_duration_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[15m])) by (le))',
+ 'histogram_quantile(0.50, sum(rate(loki_canary_metric_test_request_duration_seconds_bucket{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[15m])) by (le))',
], ['p99', 'p95'],) +
{ gridPos: { h: 6, w: 12, x: 12, y: 14 } },
dashboard.panel('Spot Check Missing %') +
- dashboard.queryPanel('topk(20, (sum by (cluster, pod) (increase(loki_canary_spot_check_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval]))/sum by (cluster, pod) (increase(loki_canary_spot_check_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) * 100)) > 0', '') +
+ dashboard.queryPanel('topk(20, (sum by (' + $._config.per_cluster_label + ', pod) (increase(loki_canary_spot_check_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval]))/sum by (' + $._config.per_cluster_label + ', pod) (increase(loki_canary_spot_check_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])) * 100)) > 0', '') +
{ gridPos: { h: 6, w: 12, x: 0, y: 20 } },
g.panel('Missing logs') +
- g.queryPanel('topk(20,(sum by (cluster, pod)(increase(loki_canary_missing_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval]))/sum by (cluster, pod)(increase(loki_canary_entries_total{cluster=~"$cluster",namespace=~"$namespace"}[$__rate_interval])))*100) > 0', 'Missing {{ cluster }} {{ pod }}') +
+ g.queryPanel('topk(20,(sum by (' + $._config.per_cluster_label + ', pod)(increase(loki_canary_missing_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval]))/sum by (' + $._config.per_cluster_label + ', pod)(increase(loki_canary_entries_total{' + $._config.per_cluster_label + '=~"$cluster",namespace=~"$namespace"}[$__rate_interval])))*100) > 0', 'Missing {{ ' + $._config.per_cluster_label + ' }} {{ pod }}') +
{ gridPos: { h: 6, w: 12, x: 12, y: 20 } },
],
diff --git a/production/loki-mixin/dashboards/loki-logs.libsonnet b/production/loki-mixin/dashboards/loki-logs.libsonnet
index 9fd6eee58950..b28d74e94366 100644
--- a/production/loki-mixin/dashboards/loki-logs.libsonnet
+++ b/production/loki-mixin/dashboards/loki-logs.libsonnet
@@ -48,7 +48,6 @@ local template = import 'grafonnet/template.libsonnet';
local cfg = self,
showMultiCluster:: true,
- clusterLabel:: $._config.per_cluster_label,
} + lokiLogs +
$.dashboard('Loki / Logs', uid='logs')
@@ -61,8 +60,9 @@ local template = import 'grafonnet/template.libsonnet';
p {
targets: [
e {
- expr: if dashboards['loki-logs.json'].showMultiCluster then super.expr
- else std.strReplace(super.expr, $._config.per_cluster_label + '="$cluster", ', ''),
+ expr: if dashboards['loki-logs.json'].showMultiCluster
+ then std.strReplace(super.expr, 'cluster="$cluster"', $._config.per_cluster_label + '="$cluster"')
+ else std.strReplace(super.expr, 'cluster="$cluster", ', ''),
}
for e in p.targets
],
diff --git a/production/loki-mixin/dashboards/loki-operational.libsonnet b/production/loki-mixin/dashboards/loki-operational.libsonnet
index e8f5d9824874..e20d7dc2d562 100644
--- a/production/loki-mixin/dashboards/loki-operational.libsonnet
+++ b/production/loki-mixin/dashboards/loki-operational.libsonnet
@@ -11,7 +11,6 @@ local utils = import 'mixin-utils/utils.libsonnet';
showAnnotations:: true,
showLinks:: true,
showMultiCluster:: true,
- clusterLabel:: $._config.per_cluster_label,
hiddenRows:: [
'Cassandra',
@@ -62,7 +61,22 @@ local utils = import 'mixin-utils/utils.libsonnet';
local replaceClusterMatchers(expr) =
if dashboards['loki-operational.json'].showMultiCluster
- then expr
+ // Replace the recording rules cluster label with the per-cluster label
+ then std.strReplace(
+ // Replace the cluster label for equality matchers with the per-cluster label
+ std.strReplace(
+ // Replace the cluster label for regex matchers with the per-cluster label
+ std.strReplace(
+ expr,
+ 'cluster=~"$cluster"',
+ $._config.per_cluster_label + '=~"$cluster"'
+ ),
+ 'cluster="$cluster"',
+ $._config.per_cluster_label + '="$cluster"'
+ ),
+ 'cluster_',
+ $._config.per_cluster_label + '_'
+ )
else
std.strReplace(
std.strReplace(
@@ -143,7 +157,7 @@ local utils = import 'mixin-utils/utils.libsonnet';
local replaceAllMatchers(expr) =
- replaceMatchers(replaceClusterMatchers(expr)),
+ replaceMatchers(expr),
local selectDatasource(ds) =
if ds == null || ds == '' then ds
@@ -179,7 +193,7 @@ local utils = import 'mixin-utils/utils.libsonnet';
datasource: selectDatasource(super.datasource),
targets: if std.objectHas(p, 'targets') then [
e {
- expr: removeInternalComponents(p.title, e.expr),
+ expr: removeInternalComponents(p.title, replaceClusterMatchers(e.expr)),
}
for e in p.targets
] else [],
@@ -188,7 +202,7 @@ local utils = import 'mixin-utils/utils.libsonnet';
datasource: selectDatasource(super.datasource),
targets: if std.objectHas(sp, 'targets') then [
e {
- expr: removeInternalComponents(p.title, e.expr),
+ expr: removeInternalComponents(p.title, replaceClusterMatchers(e.expr)),
}
for e in sp.targets
] else [],
@@ -197,7 +211,7 @@ local utils = import 'mixin-utils/utils.libsonnet';
datasource: selectDatasource(super.datasource),
targets: if std.objectHas(ssp, 'targets') then [
e {
- expr: removeInternalComponents(p.title, e.expr),
+ expr: removeInternalComponents(p.title, replaceClusterMatchers(e.expr)),
}
for e in ssp.targets
] else [],
diff --git a/production/loki-mixin/dashboards/loki-reads.libsonnet b/production/loki-mixin/dashboards/loki-reads.libsonnet
index 4dea689b1890..9b82ee0820e4 100644
--- a/production/loki-mixin/dashboards/loki-reads.libsonnet
+++ b/production/loki-mixin/dashboards/loki-reads.libsonnet
@@ -31,10 +31,9 @@ local utils = import 'mixin-utils/utils.libsonnet';
local cfg = self,
showMultiCluster:: true,
- clusterLabel:: $._config.per_cluster_label,
clusterMatchers::
if cfg.showMultiCluster then
- [utils.selector.re(cfg.clusterLabel, '$cluster')]
+ [utils.selector.re($._config.per_cluster_label, '$cluster')]
else
[],
diff --git a/production/loki-mixin/dashboards/loki-writes.libsonnet b/production/loki-mixin/dashboards/loki-writes.libsonnet
index bedb9ca10825..8227cc383492 100644
--- a/production/loki-mixin/dashboards/loki-writes.libsonnet
+++ b/production/loki-mixin/dashboards/loki-writes.libsonnet
@@ -9,10 +9,9 @@ local utils = import 'mixin-utils/utils.libsonnet';
local cfg = self,
showMultiCluster:: true,
- clusterLabel:: $._config.per_cluster_label,
clusterMatchers::
if cfg.showMultiCluster then
- [utils.selector.re(cfg.clusterLabel, '$cluster')]
+ [utils.selector.re($._config.per_cluster_label, '$cluster')]
else
[],
diff --git a/production/loki-mixin/dashboards/recording-rules.libsonnet b/production/loki-mixin/dashboards/recording-rules.libsonnet
index 2d943807c648..46618da952dc 100644
--- a/production/loki-mixin/dashboards/recording-rules.libsonnet
+++ b/production/loki-mixin/dashboards/recording-rules.libsonnet
@@ -7,7 +7,7 @@ local template = import 'grafonnet/template.libsonnet';
template.new(
'tenant',
'$datasource',
- 'query_result(sum by (id) (grafanacloud_logs_instance_info) and sum(label_replace(loki_tenant:active_streams{cluster="$cluster",namespace="$namespace"},"id","$1","tenant","(.*)")) by(id))',
+ 'query_result(sum by (id) (grafanacloud_logs_instance_info) and sum(label_replace(loki_tenant:active_streams{' + $._config.per_cluster_label + '="$cluster",namespace="$namespace"},"id","$1","tenant","(.*)")) by(id))',
regex='/"([^"]+)"/',
sort=1,
includeAll=true,
diff --git a/tools/dev/loki-tsdb-storage-s3/dev.dockerfile b/tools/dev/loki-tsdb-storage-s3/dev.dockerfile
index e1d11efb2c5a..98531c69145b 100644
--- a/tools/dev/loki-tsdb-storage-s3/dev.dockerfile
+++ b/tools/dev/loki-tsdb-storage-s3/dev.dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9
+FROM golang:1.22.2
ENV CGO_ENABLED=0
RUN go install github.com/go-delve/delve/cmd/dlv@v1.22.1
diff --git a/tools/lambda-promtail/Dockerfile b/tools/lambda-promtail/Dockerfile
index 42f17c0a96c8..4cb51bcbe84d 100644
--- a/tools/lambda-promtail/Dockerfile
+++ b/tools/lambda-promtail/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9-alpine AS build-image
+FROM golang:1.22.2-alpine AS build-image
COPY tools/lambda-promtail /src/lambda-promtail
WORKDIR /src/lambda-promtail
diff --git a/tools/lambda-promtail/template-eventbridge.yaml b/tools/lambda-promtail/template-eventbridge.yaml
index a6c2789d2c3a..4b08ba037b0e 100644
--- a/tools/lambda-promtail/template-eventbridge.yaml
+++ b/tools/lambda-promtail/template-eventbridge.yaml
@@ -88,7 +88,7 @@ Resources:
- Effect: Allow
Action:
- s3:GetObject
- Resource: arn:aws:s3:::thepalbi-lambda-lb-access-logs/*
+ Resource: !Sub 'arn:aws:s3:::${EventSourceS3Bucket}/*'
RoleName: iam_for_lambda
LambdaPromtailFunction:
Type: AWS::Lambda::Function
diff --git a/tools/tsdb/bloom-tester/Dockerfile b/tools/tsdb/bloom-tester/Dockerfile
index 136ef1e8cc33..3db7db012e43 100644
--- a/tools/tsdb/bloom-tester/Dockerfile
+++ b/tools/tsdb/bloom-tester/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.21.9 as build
+FROM golang:1.22.2-bookworm as build
ENV BUILD_IN_CONTAINER=false
COPY . /src/bloom-tester