From 4f652a8767b183aa54feb79614e2ff928e413d40 Mon Sep 17 00:00:00 2001 From: Craig Peterson <192540+captncraig@users.noreply.github.com> Date: Tue, 27 Jun 2023 19:42:33 -0400 Subject: [PATCH] Release 0.34.3 (#4275) * otelcol.exporter.prometheus: Make histogram counts cumulative for Prometheus (#4196) * Use sha256 for rpm signing to allow installation on fips-enabed systems (#4268) * Use sha256 for rpm digest signing to allow installation on fips-enabled systems * add changelog * fix startup order for prometheus.operator.servicemonitors. Fixes #4142 (#4146) * update versions for 0.34.3 * build: update to go 1.20.5 --------- Co-authored-by: Nikola Grcevski <6207777+grcevski@users.noreply.github.com> Co-authored-by: kfriedrich123 <132451878+kfriedrich123@users.noreply.github.com> --- CHANGELOG.md | 13 +++++++ build-image/Dockerfile | 2 +- build-image/windows/Dockerfile | 2 +- .../prometheus/internal/convert/convert.go | 29 ++++++++++++++- .../internal/convert/convert_test.go | 37 ++++++++++++++++++- .../prometheus/operator/common/crdmanager.go | 11 +++--- .../deploy-agent-operator-resources.md | 4 +- docs/sources/operator/getting-started.md | 2 +- .../integrations/node-exporter-config.md | 4 +- .../integrations/process-exporter-config.md | 4 +- .../static/set-up/install-agent-docker.md | 4 +- packaging/grafana-agent-flow/rpm/gpg-sign.sh | 1 + packaging/grafana-agent/rpm/gpg-sign.sh | 1 + pkg/operator/defaults.go | 2 +- production/kubernetes/agent-bare.yaml | 2 +- production/kubernetes/agent-loki.yaml | 2 +- production/kubernetes/agent-traces.yaml | 2 +- .../kubernetes/build/lib/version.libsonnet | 2 +- .../build/templates/operator/main.jsonnet | 4 +- production/kubernetes/install-bare.sh | 2 +- .../operator/templates/agent-operator.yaml | 4 +- .../tanka/grafana-agent/v1/main.libsonnet | 4 +- .../grafana-agent/v2/internal/base.libsonnet | 4 +- .../v2/internal/syncer.libsonnet | 2 +- 24 files changed, 110 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 984c78a83f4f..3182c533f8fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ This document contains a historical list of changes between releases. Only changes that impact end-user behavior are listed; changes to documentation or internal API changes are not present. +v0.34.3 (2023-06-27) +-------------------- + +### Bugfixes + +- Fixes a bug in conversion of OpenTelemetry histograms when exported to Prometheus. (@grcevski) +- Enforce sha256 digest signing for rpms enabling installation on FIPS-enabled OSes. (@kfriedrich123) +- Fix panic from improper startup ordering in `prometheus.operator.servicemonitors`. (@captncraig) + +### Other changes + +- Build with go version 1.20.5 (@captncraig) + v0.34.2 (2023-06-20) -------------------- diff --git a/build-image/Dockerfile b/build-image/Dockerfile index ea805126c08a..95c355d3702c 100644 --- a/build-image/Dockerfile +++ b/build-image/Dockerfile @@ -23,7 +23,7 @@ FROM alpine:3.17 as helm RUN apk add --no-cache helm # Dependency: Go and Go dependencies -FROM golang:1.20.4-bullseye as golang +FROM golang:1.20.5-bullseye as golang # Keep in sync with cmd/grafana-agent-operator/DEVELOPERS.md ENV CONTROLLER_GEN_VERSION v0.9.2 diff --git a/build-image/windows/Dockerfile b/build-image/windows/Dockerfile index c93bfa71baa2..feb3dfb66f90 100644 --- a/build-image/windows/Dockerfile +++ b/build-image/windows/Dockerfile @@ -1,4 +1,4 @@ -FROM library/golang:1.20.4-windowsservercore-1809 +FROM library/golang:1.20.5-windowsservercore-1809 SHELL ["powershell", "-command"] diff --git a/component/otelcol/exporter/prometheus/internal/convert/convert.go b/component/otelcol/exporter/prometheus/internal/convert/convert.go index 5decd6929794..d71eb7ac780d 100644 --- a/component/otelcol/exporter/prometheus/internal/convert/convert.go +++ b/component/otelcol/exporter/prometheus/internal/convert/convert.go @@ -10,6 +10,8 @@ package convert import ( "context" "fmt" + "math" + "sort" "strconv" "sync" "time" @@ -458,11 +460,36 @@ func (conv *Converter) consumeHistogram(app storage.Appender, memResource *memor } } + // Sort the histogram by bounds ascending + bSize := int(math.Min(float64(dp.ExplicitBounds().Len()), float64(dp.BucketCounts().Len()))) + buckets := make(map[float64]uint64, bSize) + bounds := make([]float64, 0, bSize) + for i := 0; i < dp.ExplicitBounds().Len() && i < dp.BucketCounts().Len(); i++ { + bound := dp.ExplicitBounds().At(i) + buckets[bound] = dp.BucketCounts().At(i) + bounds = append(bounds, bound) + } + + sort.Float64s(bounds) + + // Calculate cumulative count values. Prometheus expects cummulative bucket counts for histograms. + // This has nothing to do with temporality, it doesn't affect cummulative vs delta histograms, it + // simply matches the format of bucket counts expected by Prometheus. + var c uint64 = 0 + for i := 0; i < len(bounds); i++ { + bound := bounds[i] + c += buckets[bound] + buckets[bound] = c + } + // Process the boundaries. The number of buckets = number of explicit // bounds + 1. for i := 0; i < dp.ExplicitBounds().Len() && i < dp.BucketCounts().Len(); i++ { bound := dp.ExplicitBounds().At(i) - count := dp.BucketCounts().At(i) + count, ok := buckets[bound] + if !ok { + count = dp.BucketCounts().At(i) + } bucketLabel := labels.Label{ Name: model.BucketLabel, diff --git a/component/otelcol/exporter/prometheus/internal/convert/convert_test.go b/component/otelcol/exporter/prometheus/internal/convert/convert_test.go index d181408984ac..983962eef3aa 100644 --- a/component/otelcol/exporter/prometheus/internal/convert/convert_test.go +++ b/component/otelcol/exporter/prometheus/internal/convert/convert_test.go @@ -121,8 +121,41 @@ func TestConverter(t *testing.T) { # TYPE test_metric_seconds histogram test_metric_seconds_bucket{le="0.25"} 0 test_metric_seconds_bucket{le="0.5"} 111 - test_metric_seconds_bucket{le="0.75"} 0 - test_metric_seconds_bucket{le="1.0"} 222 + test_metric_seconds_bucket{le="0.75"} 111 + test_metric_seconds_bucket{le="1.0"} 333 + test_metric_seconds_bucket{le="+Inf"} 333 + test_metric_seconds_sum 100.0 + test_metric_seconds_count 333 + `, + }, + { + name: "Histogram out-of-order bounds", + input: `{ + "resource_metrics": [{ + "scope_metrics": [{ + "metrics": [{ + "name": "test_metric_seconds", + "histogram": { + "aggregation_temporality": 2, + "data_points": [{ + "start_time_unix_nano": 1000000000, + "time_unix_nano": 1000000000, + "count": 333, + "sum": 100, + "bucket_counts": [0, 111, 0, 222], + "explicit_bounds": [0.5, 1.0, 0.25, 0.75] + }] + } + }] + }] + }] + }`, + expect: ` + # TYPE test_metric_seconds histogram + test_metric_seconds_bucket{le="0.25"} 0 + test_metric_seconds_bucket{le="0.5"} 0 + test_metric_seconds_bucket{le="0.75"} 222 + test_metric_seconds_bucket{le="1.0"} 333 test_metric_seconds_bucket{le="+Inf"} 333 test_metric_seconds_sum 100.0 test_metric_seconds_count 333 diff --git a/component/prometheus/operator/common/crdmanager.go b/component/prometheus/operator/common/crdmanager.go index b1cfbcb33a63..5f5f6326a704 100644 --- a/component/prometheus/operator/common/crdmanager.go +++ b/component/prometheus/operator/common/crdmanager.go @@ -93,11 +93,6 @@ func (c *crdManager) Run(ctx context.Context) error { } }() - if err := c.runInformers(restConfig, ctx); err != nil { - return err - } - level.Info(c.logger).Log("msg", "informers started") - // Start prometheus scrape manager. flowAppendable := prometheus.NewFanout(c.args.ForwardTo, c.opts.ID, c.opts.Registerer) opts := &scrape.Options{} @@ -112,6 +107,12 @@ func (c *crdManager) Run(ctx context.Context) error { } }() + // run informers after everything else is running + if err := c.runInformers(restConfig, ctx); err != nil { + return err + } + level.Info(c.logger).Log("msg", "informers started") + // Start the target discovery loop to update the scrape manager with new targets. for { select { diff --git a/docs/sources/operator/deploy-agent-operator-resources.md b/docs/sources/operator/deploy-agent-operator-resources.md index f16671e7014b..94f71208ce3e 100644 --- a/docs/sources/operator/deploy-agent-operator-resources.md +++ b/docs/sources/operator/deploy-agent-operator-resources.md @@ -53,12 +53,12 @@ To deploy the `GrafanaAgent` resource: labels: app: grafana-agent spec: - image: grafana/agent:v0.34.2 + image: grafana/agent:v0.34.3 integrations: selector: matchLabels: agent: grafana-agent-integrations - image: grafana/agent:v0.34.2 + image: grafana/agent:v0.34.3 logLevel: info serviceAccountName: grafana-agent metrics: diff --git a/docs/sources/operator/getting-started.md b/docs/sources/operator/getting-started.md index 5a1105da9e7a..427b5fa52a8f 100644 --- a/docs/sources/operator/getting-started.md +++ b/docs/sources/operator/getting-started.md @@ -73,7 +73,7 @@ To install Agent Operator: serviceAccountName: grafana-agent-operator containers: - name: operator - image: grafana/agent-operator:v0.34.2 + image: grafana/agent-operator:v0.34.3 args: - --kubelet-service=default/kubelet --- diff --git a/docs/sources/static/configuration/integrations/node-exporter-config.md b/docs/sources/static/configuration/integrations/node-exporter-config.md index 384bd6bef553..6c6efb52b5f1 100644 --- a/docs/sources/static/configuration/integrations/node-exporter-config.md +++ b/docs/sources/static/configuration/integrations/node-exporter-config.md @@ -28,7 +28,7 @@ docker run \ -v "/proc:/host/proc:ro,rslave" \ -v /tmp/agent:/etc/agent \ -v /path/to/config.yaml:/etc/agent-config/agent.yaml \ - grafana/agent:v0.34.2 \ + grafana/agent:v0.34.3 \ --config.file=/etc/agent-config/agent.yaml ``` @@ -67,7 +67,7 @@ metadata: name: agent spec: containers: - - image: grafana/agent:v0.34.2 + - image: grafana/agent:v0.34.3 name: agent args: - --config.file=/etc/agent-config/agent.yaml diff --git a/docs/sources/static/configuration/integrations/process-exporter-config.md b/docs/sources/static/configuration/integrations/process-exporter-config.md index e98d9c35f9a0..3e9141179b26 100644 --- a/docs/sources/static/configuration/integrations/process-exporter-config.md +++ b/docs/sources/static/configuration/integrations/process-exporter-config.md @@ -20,7 +20,7 @@ docker run \ -v "/proc:/proc:ro" \ -v /tmp/agent:/etc/agent \ -v /path/to/config.yaml:/etc/agent-config/agent.yaml \ - grafana/agent:v0.34.2 \ + grafana/agent:v0.34.3 \ --config.file=/etc/agent-config/agent.yaml ``` @@ -37,7 +37,7 @@ metadata: name: agent spec: containers: - - image: grafana/agent:v0.34.2 + - image: grafana/agent:v0.34.3 name: agent args: - --config.file=/etc/agent-config/agent.yaml diff --git a/docs/sources/static/set-up/install-agent-docker.md b/docs/sources/static/set-up/install-agent-docker.md index 9c23a7739664..347b6e3c36bd 100644 --- a/docs/sources/static/set-up/install-agent-docker.md +++ b/docs/sources/static/set-up/install-agent-docker.md @@ -29,7 +29,7 @@ Grafana Agent is available as a Docker container image on the following platform docker run \ -v WAL_DATA_DIRECTORY:/etc/agent/data \ -v CONFIG_FILE_PATH:/etc/agent/agent.yaml \ - grafana/agent:v0.34.2 + grafana/agent:v0.34.3 ``` - Replace `CONFIG_FILE_PATH` with the configuration file path on your Linux host system. @@ -47,7 +47,7 @@ Grafana Agent is available as a Docker container image on the following platform docker run ^ -v WAL_DATA_DIRECTORY:c:\etc\grafana-agent\data ^ -v CONFIG_FILE_PATH:c:\etc\grafana-agent ^ - grafana/agent:v0.34.2-windows + grafana/agent:v0.34.3-windows ``` - Replace `CONFIG_FILE_PATH` with the configuration file path on your Windows host system. diff --git a/packaging/grafana-agent-flow/rpm/gpg-sign.sh b/packaging/grafana-agent-flow/rpm/gpg-sign.sh index c73d85200aef..ee69bf946dfd 100755 --- a/packaging/grafana-agent-flow/rpm/gpg-sign.sh +++ b/packaging/grafana-agent-flow/rpm/gpg-sign.sh @@ -17,6 +17,7 @@ echo "%_gpg_name Grafana %_signature gpg %_gpg_path /root/.gnupg %_gpgbin /usr/bin/gpg +%_gpg_digest_algo sha256 %__gpg /usr/bin/gpg %__gpg_sign_cmd %{__gpg} \ gpg --no-tty --batch --yes --no-verbose --no-armor \ diff --git a/packaging/grafana-agent/rpm/gpg-sign.sh b/packaging/grafana-agent/rpm/gpg-sign.sh index c73d85200aef..ee69bf946dfd 100755 --- a/packaging/grafana-agent/rpm/gpg-sign.sh +++ b/packaging/grafana-agent/rpm/gpg-sign.sh @@ -17,6 +17,7 @@ echo "%_gpg_name Grafana %_signature gpg %_gpg_path /root/.gnupg %_gpgbin /usr/bin/gpg +%_gpg_digest_algo sha256 %__gpg /usr/bin/gpg %__gpg_sign_cmd %{__gpg} \ gpg --no-tty --batch --yes --no-verbose --no-armor \ diff --git a/pkg/operator/defaults.go b/pkg/operator/defaults.go index a95108093e3c..f496b7937c78 100644 --- a/pkg/operator/defaults.go +++ b/pkg/operator/defaults.go @@ -2,7 +2,7 @@ package operator // Supported versions of the Grafana Agent. var ( - DefaultAgentVersion = "v0.34.2" + DefaultAgentVersion = "v0.34.3" DefaultAgentBaseImage = "grafana/agent" DefaultAgentImage = DefaultAgentBaseImage + ":" + DefaultAgentVersion ) diff --git a/production/kubernetes/agent-bare.yaml b/production/kubernetes/agent-bare.yaml index 1bb9c691c311..7a18a7d42eec 100644 --- a/production/kubernetes/agent-bare.yaml +++ b/production/kubernetes/agent-bare.yaml @@ -83,7 +83,7 @@ spec: valueFrom: fieldRef: fieldPath: spec.nodeName - image: grafana/agent:v0.34.2 + image: grafana/agent:v0.34.3 imagePullPolicy: IfNotPresent name: grafana-agent ports: diff --git a/production/kubernetes/agent-loki.yaml b/production/kubernetes/agent-loki.yaml index db587b45fa0b..2f96fba5aabc 100644 --- a/production/kubernetes/agent-loki.yaml +++ b/production/kubernetes/agent-loki.yaml @@ -65,7 +65,7 @@ spec: valueFrom: fieldRef: fieldPath: spec.nodeName - image: grafana/agent:v0.34.2 + image: grafana/agent:v0.34.3 imagePullPolicy: IfNotPresent name: grafana-agent-logs ports: diff --git a/production/kubernetes/agent-traces.yaml b/production/kubernetes/agent-traces.yaml index 8f70e15704b6..7a770bd227d9 100644 --- a/production/kubernetes/agent-traces.yaml +++ b/production/kubernetes/agent-traces.yaml @@ -114,7 +114,7 @@ spec: valueFrom: fieldRef: fieldPath: spec.nodeName - image: grafana/agent:v0.34.2 + image: grafana/agent:v0.34.3 imagePullPolicy: IfNotPresent name: grafana-agent-traces ports: diff --git a/production/kubernetes/build/lib/version.libsonnet b/production/kubernetes/build/lib/version.libsonnet index 50e64d7536ce..d0648c870ec8 100644 --- a/production/kubernetes/build/lib/version.libsonnet +++ b/production/kubernetes/build/lib/version.libsonnet @@ -1 +1 @@ -'grafana/agent:v0.34.2' +'grafana/agent:v0.34.3' diff --git a/production/kubernetes/build/templates/operator/main.jsonnet b/production/kubernetes/build/templates/operator/main.jsonnet index 71807f0490b9..6601af9a81ba 100644 --- a/production/kubernetes/build/templates/operator/main.jsonnet +++ b/production/kubernetes/build/templates/operator/main.jsonnet @@ -23,8 +23,8 @@ local ksm = import 'kube-state-metrics/kube-state-metrics.libsonnet'; local this = self, _images:: { - agent: 'grafana/agent:v0.34.2', - agent_operator: 'grafana/agent-operator:v0.34.2', + agent: 'grafana/agent:v0.34.3', + agent_operator: 'grafana/agent-operator:v0.34.3', ksm: 'registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.5.0', }, diff --git a/production/kubernetes/install-bare.sh b/production/kubernetes/install-bare.sh index 22bb08300cec..134b3f596ab0 100644 --- a/production/kubernetes/install-bare.sh +++ b/production/kubernetes/install-bare.sh @@ -25,7 +25,7 @@ check_installed() { check_installed curl check_installed envsubst -MANIFEST_BRANCH=v0.34.2 +MANIFEST_BRANCH=v0.34.3 MANIFEST_URL=${MANIFEST_URL:-https://raw.githubusercontent.com/grafana/agent/${MANIFEST_BRANCH}/production/kubernetes/agent-bare.yaml} NAMESPACE=${NAMESPACE:-default} diff --git a/production/operator/templates/agent-operator.yaml b/production/operator/templates/agent-operator.yaml index 9796bfb51666..0dea8aeaf467 100644 --- a/production/operator/templates/agent-operator.yaml +++ b/production/operator/templates/agent-operator.yaml @@ -372,7 +372,7 @@ spec: containers: - args: - --kubelet-service=default/kubelet - image: grafana/agent-operator:v0.34.2 + image: grafana/agent-operator:v0.34.3 imagePullPolicy: IfNotPresent name: grafana-agent-operator serviceAccount: grafana-agent-operator @@ -436,7 +436,7 @@ metadata: name: grafana-agent namespace: ${NAMESPACE} spec: - image: grafana/agent:v0.34.2 + image: grafana/agent:v0.34.3 integrations: selector: matchLabels: diff --git a/production/tanka/grafana-agent/v1/main.libsonnet b/production/tanka/grafana-agent/v1/main.libsonnet index 657d7a3aa987..16d74d33d416 100644 --- a/production/tanka/grafana-agent/v1/main.libsonnet +++ b/production/tanka/grafana-agent/v1/main.libsonnet @@ -15,8 +15,8 @@ local service = k.core.v1.service; (import './lib/traces.libsonnet') + { _images:: { - agent: 'grafana/agent:v0.34.2', - agentctl: 'grafana/agentctl:v0.34.2, + agent: 'grafana/agent:v0.34.3', + agentctl: 'grafana/agentctl:v0.34.3, }, // new creates a new DaemonSet deployment of the grafana-agent. By default, diff --git a/production/tanka/grafana-agent/v2/internal/base.libsonnet b/production/tanka/grafana-agent/v2/internal/base.libsonnet index ef5c6d0e1d02..89f1d1c6b5a4 100644 --- a/production/tanka/grafana-agent/v2/internal/base.libsonnet +++ b/production/tanka/grafana-agent/v2/internal/base.libsonnet @@ -11,8 +11,8 @@ function(name='grafana-agent', namespace='') { local this = self, _images:: { - agent: 'grafana/agent:v0.34.2', - agentctl: 'grafana/agentctl:v0.34.2', + agent: 'grafana/agent:v0.34.3', + agentctl: 'grafana/agentctl:v0.34.3', }, _config:: { name: name, diff --git a/production/tanka/grafana-agent/v2/internal/syncer.libsonnet b/production/tanka/grafana-agent/v2/internal/syncer.libsonnet index 44bf4a61b8ed..76603c37cfbd 100644 --- a/production/tanka/grafana-agent/v2/internal/syncer.libsonnet +++ b/production/tanka/grafana-agent/v2/internal/syncer.libsonnet @@ -14,7 +14,7 @@ function( ) { local _config = { api: error 'api must be set', - image: 'grafana/agentctl:v0.34.2', + image: 'grafana/agentctl:v0.34.3', schedule: '*/5 * * * *', configs: [], } + config,