├── .gitignore
├── autograf.excalidraw.png
├── examples
├── demo
│ ├── Dockerfile.grafana
│ ├── autograf.json
│ ├── docker-compose.yaml
│ ├── prometheus.yml
│ └── README.md
├── metrics_custom.txt
└── metrics.txt
├── Dockerfile
├── .github
└── workflows
│ ├── go.yaml
│ └── release.yaml
├── pkg
├── generator
│ ├── pseudodashboard.go
│ ├── util.go
│ ├── metric_test.go
│ ├── metric.go
│ ├── metric_config.go
│ ├── tree.go
│ └── util_test.go
├── prometheus
│ ├── processor.go
│ ├── metrics_file_parser.go
│ └── api_fetcher.go
└── grafana
│ ├── manage.go
│ ├── dashboard.go
│ └── panel.go
├── Makefile
├── .goreleaser.yml
├── config.go
├── go.mod
├── CHANGELOG.md
├── generate.go
├── main.go
├── README.md
├── LICENSE
└── go.sum
/.gitignore:
--------------------------------------------------------------------------------
1 | autograf
2 | dist/
3 |
--------------------------------------------------------------------------------
/autograf.excalidraw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FUSAKLA/autograf/HEAD/autograf.excalidraw.png
--------------------------------------------------------------------------------
/examples/demo/Dockerfile.grafana:
--------------------------------------------------------------------------------
1 | FROM grafana/grafana:9.5.1
2 |
3 | COPY Dockerfile.grafana /Dockerfile
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM alpine
2 |
3 | COPY autograf /usr/bin/autograf
4 | COPY Dockerfile /
5 |
6 | ENTRYPOINT ["autograf"]
7 | CMD ["--help"]
8 |
--------------------------------------------------------------------------------
/examples/metrics_custom.txt:
--------------------------------------------------------------------------------
1 | # HELP prometheus_http_requests_total Counter of HTTP requests. AUTOGRAF:{"row":"Prometheus HTTP requests","aggregation":"sum","aggregate_by":["handler","code"],"legend_position":"bottom","fill":100,"max_from_metric":"prometheus_remote_storage_shards_max"}
2 |
--------------------------------------------------------------------------------
/examples/demo/autograf.json:
--------------------------------------------------------------------------------
1 | {
2 | "prometheus_url": "http://127.0.0.1:9090",
3 | "grafana_url": "http://127.0.0.1:3000",
4 | "grafana_datasource": "Prometheus",
5 | "grafana_variables": [
6 | "job"
7 | ],
8 | "grafana_token": "glsa_3ehqArj4kYIttcmK7xNqHm2Z3O5R6piF_d6710ad4",
9 | "open_browser": true
10 | }
11 |
--------------------------------------------------------------------------------
/examples/demo/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | grafana:
5 | image: fusakla/grafana-with-token
6 | pull_policy: always
7 | ports:
8 | - 3000:3000
9 | prometheus:
10 | image: prom/prometheus
11 | ports:
12 | - 9090:9090
13 | volumes:
14 | - ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml
15 | alertmanager:
16 | image: prom/alertmanager:latest
17 | node-exporter:
18 | image: prom/node-exporter:latest
19 |
--------------------------------------------------------------------------------
/examples/demo/prometheus.yml:
--------------------------------------------------------------------------------
1 | global:
2 | scrape_interval: "5s"
3 | scrape_configs:
4 | - job_name: prometheus
5 | static_configs:
6 | - targets:
7 | - "localhost:9090"
8 | - job_name: grafana
9 | static_configs:
10 | - targets:
11 | - "grafana:3000"
12 | - job_name: alertmanager
13 | static_configs:
14 | - targets:
15 | - "alertmanager:9093"
16 | - job_name: node-exporter
17 | static_configs:
18 | - targets:
19 | - "node-exporter:9100"
20 |
--------------------------------------------------------------------------------
/examples/demo/README.md:
--------------------------------------------------------------------------------
1 | # Example demo of Autograf
2 |
3 | You will need to install or build the Autograf, see [the installation instructions](../../README.md#installation).
4 |
5 |
6 | Than you can just run
7 | ```bash
8 | # Spin-up Prometheus and Grafana
9 | docker-compose up -d
10 | # Wait for it to be ready
11 | sleep 30
12 | # Generate your first dashboard using Autograf!
13 | AUTOGRAF_CONFIG=autograf.json autograf -s '{job="node-exporter"}'
14 | ```
15 |
16 | To cleanup just run
17 | ```
18 | docker-compose rm -f -s -v
19 | ```
20 |
--------------------------------------------------------------------------------
/.github/workflows/go.yaml:
--------------------------------------------------------------------------------
1 | name: Go
2 |
3 | on:
4 | push:
5 | branches: [main]
6 | pull_request:
7 | branches: [main]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 | steps:
13 | - uses: actions/checkout@v4
14 |
15 | - name: Set up Go
16 | uses: actions/setup-go@v5
17 | with:
18 | go-version: "1.24"
19 |
20 | - name: Golangci-lint
21 | uses: golangci/golangci-lint-action@v6
22 |
23 | - name: Build
24 | run: make build
25 |
26 | - name: Test
27 | run: make test
28 |
29 | - name: E2E test
30 | run: make e2e-test
31 |
32 | - name: Run GoReleaser
33 | uses: goreleaser/goreleaser-action@v6
34 | with:
35 | distribution: goreleaser
36 | version: latest
37 | args: build --snapshot --clean
38 |
--------------------------------------------------------------------------------
/pkg/generator/pseudodashboard.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import "encoding/json"
4 |
5 | func NewPseudoDashboardFromMetrics(metrics map[string]*Metric) PseudoDashboard {
6 | return groupIntoPseudoDashboard(metrics)
7 | }
8 |
9 | type PseudoDashboard struct {
10 | Rows map[string]*PseudoRow `json:"rows"`
11 | }
12 |
13 | func (d PseudoDashboard) String() string {
14 | data, _ := json.MarshalIndent(d, "", " ")
15 | return string(data)
16 | }
17 |
18 | func (d *PseudoDashboard) AddRowPanels(rowName string, metrics []*Metric) {
19 | if d.Rows == nil {
20 | d.Rows = make(map[string]*PseudoRow)
21 | }
22 | row, ok := d.Rows[rowName]
23 | if !ok {
24 | d.Rows[rowName] = &PseudoRow{Metrics: metrics}
25 | } else {
26 | row.Metrics = append(row.Metrics, metrics...)
27 | }
28 | }
29 |
30 | type PseudoRow struct {
31 | Metrics []*Metric `json:"panels"`
32 | }
33 |
--------------------------------------------------------------------------------
/pkg/generator/util.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 | )
7 |
8 | type LimitType string
9 |
10 | const (
11 | LimitMax LimitType = "max"
12 | LimitMin LimitType = "min"
13 | )
14 |
15 | func metricWithSelector(metric, selector string) string {
16 | return fmt.Sprintf("%s%s", metric, selector)
17 | }
18 |
19 | func aggregateQuery(query, aggregation string, aggragateBy []string) string {
20 | return fmt.Sprintf("%s(%s) by (%s)", aggregation, query, strings.Join(aggragateBy, ","))
21 | }
22 |
23 | func rateCounterQuery(query, rangeSelector string) string {
24 | return fmt.Sprintf("rate(%s[%s])", query, rangeSelector)
25 | }
26 |
27 | func ThresholdQuery(metricName string, selector string, lType LimitType) string {
28 | aggregation := "min"
29 | if lType == LimitMin {
30 | aggregation = "max"
31 | }
32 | return aggregateQuery(metricWithSelector(metricName, selector), aggregation, []string{})
33 | }
34 |
--------------------------------------------------------------------------------
/.github/workflows/release.yaml:
--------------------------------------------------------------------------------
1 | name: goreleaser
2 |
3 | on:
4 | push:
5 | tags:
6 | - "*"
7 |
8 | permissions:
9 | contents: write
10 |
11 | jobs:
12 | goreleaser:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - name: Checkout
16 | uses: actions/checkout@v4
17 | with:
18 | fetch-depth: 0
19 | - name: Set up Go
20 | uses: actions/setup-go@v5
21 | with:
22 | go-version: "1.24"
23 |
24 | - name: Login to Docker Hub
25 | uses: docker/login-action@v1
26 | with:
27 | username: ${{ secrets.DOCKERHUB_USERNAME }}
28 | password: ${{ secrets.DOCKERHUB_TOKEN }}
29 | - name: Run GoReleaser
30 | uses: goreleaser/goreleaser-action@v6
31 | with:
32 | distribution: goreleaser
33 | version: latest
34 | args: release --clean
35 | env:
36 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
37 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | #!/usr/bin/make -f
2 | SRC_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
3 |
4 | AUTOGRAF_BIN := ./autograf
5 |
6 | all: deps lint build goreleaser-build test e2e-test
7 |
8 | $(TMP_DIR):
9 | mkdir -p $(TMP_DIR)
10 |
11 | RELEASE_NOTES ?= $(TMP_DIR)/release_notes
12 | $(RELEASE_NOTES): $(TMP_DIR)
13 | @echo "Generating release notes to $(RELEASE_NOTES) ..."
14 | @csplit -q -n1 --suppress-matched -f $(TMP_DIR)/release-notes-part CHANGELOG.md '/## \[\s*v.*\]/' {1}
15 | @mv $(TMP_DIR)/release-notes-part1 $(RELEASE_NOTES)
16 | @rm $(TMP_DIR)/release-notes-part*
17 |
18 | lint:
19 | golangci-lint run
20 |
21 | test:
22 | go test -race ./...
23 |
24 | e2e-test: build
25 | $(AUTOGRAF_BIN) --metrics-file examples/metrics.txt --grafana-url=""
26 |
27 | build:
28 | GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o $(AUTOGRAF_BIN)
29 |
30 | goreleaser-build:
31 | goreleaser release --snapshot --clean
32 |
33 | docker: build
34 | docker build -t fusakla/autograf .
35 |
36 | .PHONY: clean
37 | clean:
38 | rm -rf dist $(AUTOGRAF_BIN) $(TMP_DIR)
39 |
40 | .PHONY: deps
41 | deps:
42 | go mod tidy && go mod verify
43 |
--------------------------------------------------------------------------------
/.goreleaser.yml:
--------------------------------------------------------------------------------
1 | before:
2 | hooks:
3 | - go mod download
4 |
5 | builds:
6 | - main: ./
7 | binary: autograf
8 | env:
9 | - CGO_ENABLED=0
10 | goos:
11 | - linux
12 | - darwin
13 | - windows
14 | goarch:
15 | - amd64
16 |
17 | source:
18 | enabled: true
19 |
20 | dockers:
21 | - goos: linux
22 | goarch: amd64
23 | image_templates:
24 | - fusakla/autograf:{{ .Tag }}
25 | - fusakla/autograf:v{{ .Major }}.{{ .Minor }}
26 | - fusakla/autograf:v{{ .Major }}
27 | - fusakla/autograf:latest
28 | build_flag_templates:
29 | - --pull
30 | # Labels according to opencontainers label schema https://github.com/opencontainers/image-spec/blob/master/annotations.md
31 | - --label=org.opencontainers.image.created={{.Date}}
32 | - --label=org.opencontainers.image.revision={{.FullCommit}}
33 | - --label=org.opencontainers.image.version={{.Version}}
34 |
35 | - --label=org.opencontainers.image.title={{.ProjectName}}
36 | - --label=org.opencontainers.image.description=Tool to generate Grafana dashboard form Prometheus metrics.
37 | - --label=org.opencontainers.image.authors=autograf@fusakla.cz
38 | - --label=org.opencontainers.image.url={{.GitURL}}
39 | - --label=org.opencontainers.image.documentation={{.GitURL}}
40 | - --label=org.opencontainers.image.source={{replace .GitURL ".git" "" }}
41 |
--------------------------------------------------------------------------------
/config.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "encoding/json"
5 | "errors"
6 | "fmt"
7 | "os"
8 | "path"
9 |
10 | "github.com/sirupsen/logrus"
11 | )
12 |
13 | type config struct {
14 | PrometheusURL string `json:"prometheus_url,omitempty"`
15 | PrometheusBearerToken string `json:"prometheus_bearer_token,omitempty"`
16 |
17 | GrafanaURL string `json:"grafana_url,omitempty"`
18 | GrafanaToken string `json:"grafana_token,omitempty"`
19 | GrafanaFolder string `json:"grafana_folder,omitempty"`
20 | GrafanaDashboardName string `json:"grafana_dashboard_name,omitempty"`
21 | GrafanaDataSource string `json:"grafana_datasource,omitempty"`
22 | GrafanaVariables []string `json:"grafana_variables,omitempty"`
23 |
24 | OpenBrowser bool `json:"open_browser,omitempty"`
25 | }
26 |
27 | func loadConfig(logger logrus.FieldLogger) config {
28 | var c config
29 | configFilePath, ok := os.LookupEnv("AUTOGRAF_CONFIG")
30 | if !ok {
31 | home, err := os.UserHomeDir()
32 | if err != nil {
33 | logger.WithField("error", err).Warn("failed to load autograf config from home dir")
34 | return c
35 | }
36 | configFilePath = path.Join(home, ".autograf.json")
37 | if _, err := os.Stat(configFilePath); errors.Is(err, os.ErrNotExist) {
38 | configFilePath = path.Join(home, ".config", "autograf.json")
39 | }
40 | }
41 | data, err := os.ReadFile(configFilePath)
42 | if err != nil {
43 | return c
44 | }
45 | fmt.Fprintf(os.Stderr, "Using config file %s\n", configFilePath)
46 | if err := json.Unmarshal(data, &c); err != nil {
47 | logger.WithField("error", err).Warn("invalid config file format")
48 | }
49 | return c
50 | }
51 |
--------------------------------------------------------------------------------
/pkg/generator/metric_test.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import (
4 | "testing"
5 |
6 | "gotest.tools/assert"
7 | )
8 |
9 | func TestMetric_PromQlQuery(t *testing.T) {
10 |
11 | type tc struct {
12 | name string
13 | metric Metric
14 | selector string
15 | rangeSelector string
16 | expectedQuery string
17 | }
18 | cases := []tc{
19 | {
20 | name: "gauge",
21 | metric: Metric{
22 | MetricType: MetricTypeGauge,
23 | Name: "queue_size",
24 | Config: MetricConfig{},
25 | },
26 | selector: `{foo="bar"}`,
27 | rangeSelector: "5m",
28 | expectedQuery: `queue_size{foo="bar"}`,
29 | },
30 | {
31 | name: "counter",
32 | metric: Metric{
33 | MetricType: MetricTypeCounter,
34 | Name: "counter_total",
35 | Config: MetricConfig{},
36 | },
37 | selector: `{foo="bar"}`,
38 | rangeSelector: "5m",
39 | expectedQuery: `rate(counter_total{foo="bar"}[5m])`,
40 | },
41 | {
42 | name: "histogram",
43 | metric: Metric{
44 | MetricType: MetricTypeHistogram,
45 | Name: "histogram_count",
46 | Config: MetricConfig{},
47 | },
48 | selector: `{foo="bar"}`,
49 | rangeSelector: "5m",
50 | expectedQuery: `sum(rate(histogram_count{foo="bar"}[5m])) by (le)`,
51 | },
52 | {
53 | name: "summary",
54 | metric: Metric{
55 | MetricType: MetricTypeSummary,
56 | Name: "summary",
57 | Config: MetricConfig{},
58 | },
59 | selector: `{foo="bar"}`,
60 | rangeSelector: "5m",
61 | expectedQuery: `sum(summary{foo="bar"}) by (quantile)`,
62 | },
63 | {
64 | name: "info",
65 | metric: Metric{
66 | MetricType: MetricTypeInfo,
67 | Name: "app_info",
68 | Config: MetricConfig{},
69 | },
70 | selector: `{foo="bar"}`,
71 | rangeSelector: "5m",
72 | expectedQuery: `app_info{foo="bar"}`,
73 | },
74 | {
75 | name: "gauge with time",
76 | metric: Metric{
77 | MetricType: MetricTypeGauge,
78 | Name: "last_timestamp_seconds",
79 | Config: MetricConfig{},
80 | },
81 | selector: `{foo="bar"}`,
82 | rangeSelector: "5m",
83 | expectedQuery: `time() - last_timestamp_seconds{foo="bar"}`,
84 | },
85 | }
86 | for _, tt := range cases {
87 | t.Run(tt.name, func(t *testing.T) {
88 | assert.Equal(t, tt.expectedQuery, tt.metric.PromQlQuery(tt.selector, tt.rangeSelector))
89 | })
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/pkg/prometheus/processor.go:
--------------------------------------------------------------------------------
1 | package prometheus
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 |
7 | "github.com/fusakla/autograf/pkg/generator"
8 | )
9 |
10 | func guessMetricType(metric *generator.Metric) {
11 | if strings.HasSuffix(metric.Name, "_total") {
12 | metric.MetricType = generator.MetricTypeCounter
13 | }
14 | if strings.HasSuffix(metric.Name, "_info") || strings.HasSuffix(metric.Name, "_labels") {
15 | metric.MetricType = generator.MetricTypeInfo
16 | }
17 | if metric.MetricType == generator.MetricTypeHistogram && (strings.HasSuffix(string(metric.Name), "_sum") || strings.HasSuffix(string(metric.Name), "_count")) {
18 | metric.MetricType = generator.MetricTypeCounter
19 | }
20 | }
21 |
22 | func guessMetricUnit(metric *generator.Metric) {
23 | if strings.Contains(metric.Name, "_cpu_seconds") {
24 | metric.Unit = generator.MetricUnitNone
25 | } else if strings.Contains(metric.Name, "_seconds") {
26 | metric.Unit = generator.MetricUnitSeconds
27 | } else if strings.Contains(metric.Name, "_bytes") {
28 | metric.Unit = generator.MetricUnitsBytes
29 | } else if strings.Contains(metric.Name, "_volt") {
30 | metric.Unit = generator.MetricUnitsVolt
31 | } else if strings.Contains(metric.Name, "_ampere") {
32 | metric.Unit = generator.MetricUnitsAmpere
33 | } else if strings.Contains(metric.Name, "_hertz") {
34 | metric.Unit = generator.MetricUnitsHertz
35 | } else if strings.Contains(metric.Name, "_celsius") {
36 | metric.Unit = generator.MetricUnitsCelsius
37 | }
38 |
39 | }
40 |
41 | func dropCreatedMetrics(metrics map[string]*generator.Metric) {
42 | for k := range metrics {
43 | metricName := strings.TrimSuffix(k, "_created")
44 | if k == metricName {
45 | continue
46 | }
47 | if _, ok := metrics[metricName]; ok {
48 | delete(metrics, k)
49 | continue
50 | }
51 | if _, ok := metrics[metricName+"_total"]; ok {
52 | delete(metrics, k)
53 | continue
54 | }
55 | if _, ok := metrics[metricName+"_count"]; ok {
56 | delete(metrics, k)
57 | continue
58 | }
59 | }
60 | }
61 |
62 | func ProcessMetrics(metrics map[string]*generator.Metric) error {
63 | var err error
64 | dropCreatedMetrics(metrics)
65 | for _, metric := range metrics {
66 | guessMetricUnit(metric)
67 | guessMetricType(metric)
68 | metric.Config, err = generator.LoadConfigFromHelp(metric.Help)
69 | if err != nil {
70 | return fmt.Errorf("failed to parse autograf config in metric HELP: %w", err)
71 | }
72 | metric.Threshold = metric.Config.ThresholdMetric()
73 | }
74 | return nil
75 | }
76 |
--------------------------------------------------------------------------------
/pkg/grafana/manage.go:
--------------------------------------------------------------------------------
1 | package grafana
2 |
3 | import (
4 | "fmt"
5 | "net/url"
6 |
7 | "github.com/go-openapi/strfmt"
8 | "github.com/gosimple/slug"
9 | "github.com/grafana/grafana-foundation-sdk/go/cog"
10 | "github.com/grafana/grafana-foundation-sdk/go/dashboard"
11 | grafanaClient "github.com/grafana/grafana-openapi-client-go/client"
12 | "github.com/grafana/grafana-openapi-client-go/client/folders"
13 | "github.com/grafana/grafana-openapi-client-go/models"
14 | )
15 |
16 | func NewClient(urlStr string, token string) *client {
17 | url, _ := url.Parse(urlStr)
18 | fmt.Println("Connecting to Grafana at", url.String())
19 | return &client{
20 | grafanaCli: grafanaClient.NewHTTPClientWithConfig(strfmt.Default, &grafanaClient.TransportConfig{
21 | Host: url.Host,
22 | BasePath: url.Path + "/api",
23 | Schemes: []string{url.Scheme},
24 | APIKey: token,
25 | // Debug: true,
26 | }),
27 | url: url.String(),
28 | }
29 | }
30 |
31 | type client struct {
32 | url string
33 | grafanaCli *grafanaClient.GrafanaHTTPAPI
34 | }
35 |
36 | func (c *client) DatasourceIDByName(name string) (string, error) {
37 | resp, err := c.grafanaCli.Datasources.GetDataSourceByName(name)
38 | if err != nil {
39 | return "", fmt.Errorf("error getting data sources: %w", err)
40 | }
41 | return resp.Payload.UID, nil
42 | }
43 |
44 | func (c *client) EnsureFolder(name string) (string, error) {
45 | resp, err := c.grafanaCli.Folders.GetFolders(&folders.GetFoldersParams{})
46 | if err != nil {
47 | return "", fmt.Errorf("error getting folders: %w", err)
48 | }
49 | for _, folder := range resp.Payload {
50 | if folder.Title == name {
51 | return folder.UID, nil
52 | }
53 | }
54 | newFolderResp, err := c.grafanaCli.Folders.CreateFolder(&models.CreateFolderCommand{
55 | Title: name,
56 | })
57 | if err != nil {
58 | return "", fmt.Errorf("error creating folder: %w", err)
59 | }
60 | return newFolderResp.Payload.UID, nil
61 | }
62 |
63 | func (c *client) UpsertDashboard(folderUid string, dashboard dashboard.Dashboard) (string, error) {
64 | dashboard.Uid = cog.ToPtr(slug.Make(*dashboard.Title))
65 | resp, err := c.grafanaCli.Dashboards.PostDashboard(&models.SaveDashboardCommand{
66 | FolderUID: folderUid,
67 | Overwrite: true,
68 | Dashboard: dashboard,
69 | })
70 | if err != nil {
71 | return "", fmt.Errorf("error saving dashboard: %w", err)
72 | }
73 | if resp == nil {
74 | return "", fmt.Errorf("error saving dashboard: response is nil")
75 | }
76 | u, err := url.Parse(c.url)
77 | if err != nil {
78 | return "", err
79 | }
80 | u.Path = *resp.Payload.URL
81 | return u.String(), nil
82 | }
83 |
--------------------------------------------------------------------------------
/pkg/generator/metric.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import "regexp"
4 |
5 | // MetricType models the type of a metric.
6 | type MetricType string
7 |
8 | const (
9 | // Possible values for MetricType
10 | MetricTypeCounter MetricType = "counter"
11 | MetricTypeGauge MetricType = "gauge"
12 | MetricTypeHistogram MetricType = "histogram"
13 | MetricTypeGaugeHistogram MetricType = "gaugehistogram"
14 | MetricTypeSummary MetricType = "summary"
15 | MetricTypeInfo MetricType = "info"
16 | MetricTypeStateset MetricType = "stateset"
17 | MetricTypeUnknown MetricType = "unknown"
18 | )
19 |
20 | type MetricUnit string
21 |
22 | const (
23 | MetricUnitNone MetricUnit = "none"
24 | MetricUnitSeconds MetricUnit = "s"
25 | MetricUnitsBytes MetricUnit = "decbytes"
26 | MetricUnitsAmpere MetricUnit = "amp"
27 | MetricUnitsVolt MetricUnit = "volt"
28 | MetricUnitsHertz MetricUnit = "rothz"
29 | MetricUnitsCelsius MetricUnit = "celsius"
30 | )
31 |
32 | type Metric struct {
33 | MetricType MetricType
34 | Name string
35 | Help string
36 | Unit MetricUnit
37 | Comment string
38 | Config MetricConfig
39 | Threshold *Metric
40 | }
41 |
42 | var timeMetricsRegexp = regexp.MustCompile(`.+(_time|_time_seconds|_timestamp|_timestamp_seconds|_update|_started|_last_seen)$`)
43 |
44 | func (m *Metric) PromQlQuery(selector string, rangeSelector string) string {
45 | query := ""
46 | switch m.MetricType {
47 | case MetricTypeGauge:
48 | query = metricWithSelector(m.Name, selector)
49 | if timeMetricsRegexp.MatchString(m.Name) {
50 | query = "time() - " + query
51 | m.Unit = MetricUnitSeconds
52 | }
53 | case MetricTypeCounter:
54 | if timeMetricsRegexp.MatchString(m.Name) {
55 | query = "time() - " + m.Name
56 | m.Unit = MetricUnitSeconds
57 | } else {
58 | query = rateCounterQuery(metricWithSelector(m.Name, selector), rangeSelector)
59 | }
60 | case MetricTypeHistogram:
61 | query = rateCounterQuery(metricWithSelector(m.Name, selector), rangeSelector)
62 | m.Config.AggregateBy = append(m.Config.AggregateBy, "le")
63 | if m.Config.Aggregation == "" {
64 | m.Config.Aggregation = "sum"
65 | }
66 | case MetricTypeSummary:
67 | query = metricWithSelector(m.Name, selector)
68 | m.Config.AggregateBy = append(m.Config.AggregateBy, "quantile")
69 | if m.Config.Aggregation == "" {
70 | m.Config.Aggregation = "sum"
71 | }
72 | default:
73 | query = metricWithSelector(m.Name, selector)
74 | }
75 | if m.Config.Aggregation != "" {
76 | query = aggregateQuery(query, m.Config.Aggregation, m.Config.AggregateBy)
77 | }
78 | return query
79 | }
80 |
--------------------------------------------------------------------------------
/pkg/generator/metric_config.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import (
4 | "encoding/json"
5 | "strings"
6 |
7 | validate "github.com/go-playground/validator/v10"
8 | )
9 |
10 | type MetricConfig struct {
11 | // Overrides name of the row, all metrics with the same row name will be grouped together
12 | Row string
13 |
14 | // Type of aggregation to use
15 | Aggregation string `validate:"omitempty,oneof=avg max min group count sum"`
16 | // Labels to aggregate by
17 | AggregateBy []string `json:"aggregate_by" validate:"excluded_without=Aggregation"`
18 |
19 | // Stack series
20 | Stack bool
21 | // How thick the line should be
22 | LineWidth int `validate:"gte=0,lte=10"`
23 | // Opacity of line fill
24 | Fill int `validate:"gte=0,lte=100"`
25 | // Scale of the Y axis
26 | Scale string `validate:"oneof=linear log2 log10"`
27 | // Where to place the legend
28 | LegendPosition string `json:"legend_position" validate:"oneof=bottom right hide"`
29 | // What calculations include in the legend
30 | LegendCalcs []string `json:"legend_calculations"`
31 | // Width of the panel
32 | Width int `validate:"gte=1,lte=12"`
33 | // Height of the panel
34 | Height int `validate:"gte=1,lte=12"`
35 | // Metric name to use as a max threshold in the graph
36 | MaxFromMetric string `json:"max_from_metric"`
37 | // Metric name to use as a min threshold in the graph
38 | MinFromMetric string `json:"min_from_metric"`
39 | }
40 |
41 | func (c MetricConfig) ThresholdMetric() *Metric {
42 | defaultConfig := MetricConfig{LineWidth: 2, Fill: 0, Stack: false}
43 | if c.MaxFromMetric != "" {
44 | defaultConfig.Aggregation = "min"
45 | return &Metric{Name: c.MaxFromMetric, Config: defaultConfig}
46 | } else if c.MinFromMetric != "" {
47 | defaultConfig.Aggregation = "max"
48 | return &Metric{Name: c.MaxFromMetric, Config: defaultConfig}
49 | }
50 | return nil
51 | }
52 |
53 | var configSeparator = " AUTOGRAF:"
54 |
55 | var defaultConfig = MetricConfig{
56 | Stack: false,
57 | LineWidth: 1,
58 | Fill: 1,
59 | Scale: "linear",
60 | LegendPosition: "bottom",
61 | LegendCalcs: []string{"max", "avg", "last"},
62 | Width: 8,
63 | Height: 5,
64 | }
65 |
66 | func LoadConfigFromHelp(help string) (MetricConfig, error) {
67 | conf := defaultConfig
68 | parts := strings.Split(help, configSeparator)
69 | if len(parts) < 2 {
70 | return conf, nil
71 | }
72 | dec := json.NewDecoder(strings.NewReader(strings.TrimSpace(parts[1])))
73 | dec.DisallowUnknownFields()
74 | if err := dec.Decode(&conf); err != nil {
75 | return conf, err
76 | }
77 | err := validate.New().Struct(conf)
78 | if err != nil {
79 | return conf, err
80 | }
81 | return conf, nil
82 | }
83 |
--------------------------------------------------------------------------------
/pkg/generator/tree.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import (
4 | "fmt"
5 | "maps"
6 | "slices"
7 | "strings"
8 | )
9 |
10 | func newTree(prefix string, level int) *metricsTree {
11 | return &metricsTree{
12 | prefix: prefix,
13 | level: level,
14 | leafs: make(map[string]*metricsTree),
15 | }
16 | }
17 |
18 | type metricsTree struct {
19 | leafs map[string]*metricsTree
20 | prefix string
21 | metric *Metric
22 | level int
23 | }
24 |
25 | func (t *metricsTree) metrics() []*Metric {
26 | metrics := []*Metric{}
27 | if t.metric != nil {
28 | metrics = append(metrics, t.metric)
29 | }
30 | for _, l := range t.leafs {
31 | if l.metric != nil {
32 | metrics = append(metrics, l.metric)
33 | } else {
34 | metrics = append(metrics, l.metrics()...)
35 | }
36 | }
37 | return metrics
38 | }
39 |
40 | func (t *metricsTree) metricGroups() map[string][]*Metric {
41 | others := []*Metric{}
42 | groups := map[string][]*Metric{}
43 | for _, l := range t.leafs {
44 | subtreeMetrics := l.metrics()
45 | if len(subtreeMetrics) < 3 && t.prefix != "" {
46 | others = append(others, subtreeMetrics...)
47 | } else {
48 | for k, v := range l.metricGroups() {
49 | groups[k] = v
50 | }
51 | }
52 | }
53 | if len(others) == 1 {
54 | groups[others[0].Name] = others
55 | } else if len(others) > 0 {
56 | groups[t.prefix] = others
57 | }
58 | return groups
59 | }
60 |
61 | func (t metricsTree) String() string {
62 | indent := strings.Repeat(" ", t.level)
63 | out := ""
64 | out += indent + t.prefix + "\n"
65 | if t.metric != nil {
66 | out += fmt.Sprintf("%s- %v", indent, t.metric)
67 | }
68 | for _, l := range t.leafs {
69 | out += "\n" + l.String()
70 | }
71 | return out
72 | }
73 |
74 | func (t *metricsTree) add(metric *Metric) {
75 | strippedMetricName := strings.TrimPrefix(strings.TrimPrefix(metric.Name, t.prefix), "_")
76 | if strippedMetricName == "" {
77 | t.metric = metric
78 | return
79 | }
80 | parts := strings.SplitN(strippedMetricName, "_", 2)
81 | prefix := parts[0]
82 | if _, ok := t.leafs[prefix]; !ok {
83 | t.leafs[prefix] = newTree(strings.TrimPrefix(t.prefix+"_"+prefix, "_"), t.level+1)
84 | }
85 | t.leafs[prefix].add(metric)
86 | }
87 |
88 | func groupIntoPseudoDashboard(metrics map[string]*Metric) PseudoDashboard {
89 | tree := newTree("", 0)
90 | dashboard := PseudoDashboard{}
91 | for _, mName := range slices.Sorted(maps.Keys(metrics)) {
92 | m := metrics[mName]
93 | if m.Config.Row != "" {
94 | dashboard.AddRowPanels(m.Config.Row, []*Metric{m})
95 | continue
96 | }
97 | tree.add(m)
98 | }
99 | for k, v := range tree.metricGroups() {
100 | dashboard.AddRowPanels(k, v)
101 | }
102 | return dashboard
103 | }
104 |
--------------------------------------------------------------------------------
/pkg/generator/util_test.go:
--------------------------------------------------------------------------------
1 | package generator
2 |
3 | import "testing"
4 |
5 | func Test_metricWithSelector(t *testing.T) {
6 | type args struct {
7 | metric string
8 | selector string
9 | }
10 | tests := []struct {
11 | name string
12 | args args
13 | want string
14 | }{
15 | {
16 | name: "Empty selector",
17 | args: args{
18 | metric: "queue_size",
19 | selector: "",
20 | },
21 | want: "queue_size",
22 | },
23 | {
24 | name: "Valid selector",
25 | args: args{
26 | metric: "queue_size",
27 | selector: `{foo="bar"}`,
28 | },
29 | want: `queue_size{foo="bar"}`,
30 | },
31 | }
32 | for _, tt := range tests {
33 | t.Run(tt.name, func(t *testing.T) {
34 | if got := metricWithSelector(tt.args.metric, tt.args.selector); got != tt.want {
35 | t.Errorf("metricWithSelector() = %v, want %v", got, tt.want)
36 | }
37 | })
38 | }
39 | }
40 | func Test_aggregateQuery(t *testing.T) {
41 | type args struct {
42 | query string
43 | aggregation string
44 | aggragateBy []string
45 | }
46 | tests := []struct {
47 | name string
48 | args args
49 | want string
50 | }{
51 | {
52 | name: "Empty aggragateBy",
53 | args: args{
54 | query: "queue_size",
55 | aggregation: "sum",
56 | aggragateBy: []string{},
57 | },
58 | want: "sum(queue_size) by ()",
59 | },
60 | {
61 | name: "Valid aggragateBy",
62 | args: args{
63 | query: "queue_size",
64 | aggregation: "avg",
65 | aggragateBy: []string{"foo", "bar"},
66 | },
67 | want: "avg(queue_size) by (foo,bar)",
68 | },
69 | }
70 | for _, tt := range tests {
71 | t.Run(tt.name, func(t *testing.T) {
72 | if got := aggregateQuery(tt.args.query, tt.args.aggregation, tt.args.aggragateBy); got != tt.want {
73 | t.Errorf("aggregateQuery() = %v, want %v", got, tt.want)
74 | }
75 | })
76 | }
77 | }
78 | func Test_rateCounterQuery(t *testing.T) {
79 | type args struct {
80 | query string
81 | rangeSelector string
82 | }
83 | tests := []struct {
84 | name string
85 | args args
86 | want string
87 | }{
88 | {
89 | name: "Empty rangeSelector",
90 | args: args{
91 | query: "events_total",
92 | rangeSelector: "$__range_interval",
93 | },
94 | want: "rate(events_total[$__range_interval])",
95 | },
96 | {
97 | name: "Valid rangeSelector",
98 | args: args{
99 | query: "events_total",
100 | rangeSelector: "5m",
101 | },
102 | want: "rate(events_total[5m])",
103 | },
104 | }
105 | for _, tt := range tests {
106 | t.Run(tt.name, func(t *testing.T) {
107 | if got := rateCounterQuery(tt.args.query, tt.args.rangeSelector); got != tt.want {
108 | t.Errorf("rateCounterQuery() = %v, want %v", got, tt.want)
109 | }
110 | })
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/fusakla/autograf
2 |
3 | go 1.24
4 |
5 | require github.com/alecthomas/kong v0.9.0
6 |
7 | require (
8 | github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
9 | github.com/cespare/xxhash/v2 v2.3.0 // indirect
10 | github.com/gabriel-vasile/mimetype v1.4.5 // indirect
11 | github.com/go-logr/logr v1.4.2 // indirect
12 | github.com/go-logr/stdr v1.2.2 // indirect
13 | github.com/go-openapi/analysis v0.23.0 // indirect
14 | github.com/go-openapi/errors v0.22.0 // indirect
15 | github.com/go-openapi/jsonpointer v0.21.0 // indirect
16 | github.com/go-openapi/jsonreference v0.21.0 // indirect
17 | github.com/go-openapi/loads v0.22.0 // indirect
18 | github.com/go-openapi/runtime v0.28.0 // indirect
19 | github.com/go-openapi/spec v0.21.0 // indirect
20 | github.com/go-openapi/swag v0.23.0 // indirect
21 | github.com/go-openapi/validate v0.24.0 // indirect
22 | github.com/go-playground/locales v0.14.1 // indirect
23 | github.com/go-playground/universal-translator v0.18.1 // indirect
24 | github.com/gogo/protobuf v1.3.2 // indirect
25 | github.com/google/go-cmp v0.6.0 // indirect
26 | github.com/google/uuid v1.6.0 // indirect
27 | github.com/gosimple/unidecode v1.0.1 // indirect
28 | github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect
29 | github.com/josharian/intern v1.0.0 // indirect
30 | github.com/json-iterator/go v1.1.12 // indirect
31 | github.com/leodido/go-urn v1.4.0 // indirect
32 | github.com/mailru/easyjson v0.7.7 // indirect
33 | github.com/mitchellh/mapstructure v1.5.0 // indirect
34 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
35 | github.com/modern-go/reflect2 v1.0.2 // indirect
36 | github.com/oklog/ulid v1.3.1 // indirect
37 | github.com/opentracing/opentracing-go v1.2.0 // indirect
38 | github.com/pkg/errors v0.9.1 // indirect
39 | github.com/prometheus/client_model v0.6.1 // indirect
40 | go.mongodb.org/mongo-driver v1.14.0 // indirect
41 | go.opentelemetry.io/otel v1.28.0 // indirect
42 | go.opentelemetry.io/otel/metric v1.28.0 // indirect
43 | go.opentelemetry.io/otel/trace v1.28.0 // indirect
44 | golang.org/x/crypto v0.31.0 // indirect
45 | golang.org/x/net v0.33.0 // indirect
46 | golang.org/x/sync v0.10.0 // indirect
47 | golang.org/x/sys v0.28.0 // indirect
48 | golang.org/x/text v0.21.0 // indirect
49 | google.golang.org/protobuf v1.34.2 // indirect
50 | gopkg.in/yaml.v3 v3.0.1 // indirect
51 | )
52 |
53 | require (
54 | github.com/go-openapi/strfmt v0.23.0
55 | github.com/go-playground/validator/v10 v10.22.0
56 | github.com/gosimple/slug v1.15.0
57 | github.com/grafana/grafana-foundation-sdk/go v0.0.0-20250613155137-bade83b30287
58 | github.com/grafana/grafana-openapi-client-go v0.0.0-20250108132429-8d7e1f158f65
59 | github.com/prometheus/client_golang v1.20.2
60 | github.com/prometheus/common v0.55.0
61 | github.com/prometheus/prometheus v0.54.0
62 | github.com/sirupsen/logrus v1.9.3
63 | gotest.tools v2.2.0+incompatible
64 | )
65 |
--------------------------------------------------------------------------------
/pkg/prometheus/metrics_file_parser.go:
--------------------------------------------------------------------------------
1 | package prometheus
2 |
3 | import (
4 | "io"
5 | "strings"
6 |
7 | "github.com/fusakla/autograf/pkg/generator"
8 | "github.com/prometheus/common/model"
9 | "github.com/prometheus/prometheus/model/labels"
10 | "github.com/prometheus/prometheus/model/textparse"
11 | )
12 |
13 | func newFileMetrics() fileMetrics {
14 | return fileMetrics{metrics: map[string]*generator.Metric{}}
15 | }
16 |
17 | type fileMetrics struct {
18 | metrics map[string]*generator.Metric
19 | }
20 |
21 | func (f *fileMetrics) add(metric generator.Metric) {
22 | m, ok := f.metrics[metric.Name]
23 | if !ok {
24 | f.metrics[metric.Name] = &metric
25 | return
26 | }
27 | if metric.Name != "" {
28 | m.Name = metric.Name
29 | }
30 | if metric.Help != "" {
31 | m.Help = metric.Help
32 | }
33 | if metric.Unit != "" {
34 | m.Unit = metric.Unit
35 | }
36 | if metric.MetricType != "" {
37 | m.MetricType = metric.MetricType
38 | }
39 | }
40 |
41 | func (f *fileMetrics) addHistograms(histograms []string) {
42 | for _, h := range histograms {
43 | m := f.metrics[h]
44 | f.add(generator.Metric{Name: m.Name + "_bucket", MetricType: generator.MetricTypeHistogram, Help: m.Help, Unit: m.Unit})
45 | f.add(generator.Metric{Name: m.Name + "_sum", MetricType: generator.MetricTypeHistogram, Help: m.Help, Unit: m.Unit})
46 | f.add(generator.Metric{Name: m.Name + "_count", MetricType: generator.MetricTypeHistogram, Help: m.Help, Unit: m.Unit})
47 | delete(f.metrics, h)
48 | }
49 | }
50 |
51 | func (f *fileMetrics) finalMetrics() map[string]*generator.Metric {
52 | delete(f.metrics, "")
53 | return f.metrics
54 | }
55 |
56 | func ParseMetricsText(text []byte, openMetrics bool) (map[string]*generator.Metric, error) {
57 | metrics := newFileMetrics()
58 | histograms := []string{}
59 | contentType := "text"
60 | if openMetrics {
61 | contentType = "application/openmetrics-text"
62 | }
63 | p, err := textparse.New(text, contentType, true, labels.NewSymbolTable())
64 | if err != nil {
65 | return nil, err
66 | }
67 |
68 | for {
69 | var entryType textparse.Entry
70 | if entryType, err = p.Next(); err != nil {
71 | if err == io.EOF {
72 | break
73 | }
74 | return nil, err
75 | }
76 | switch entryType {
77 | case textparse.EntryType:
78 | mName, mType := p.Type()
79 | if mType == model.MetricTypeHistogram {
80 | histograms = append(histograms, string(mName))
81 | }
82 | metrics.add(generator.Metric{Name: string(mName), MetricType: generator.MetricType(mType)})
83 | case textparse.EntryHelp:
84 | mName, mHelp := p.Help()
85 | metrics.add(generator.Metric{Name: string(mName), Help: string(mHelp)})
86 | case textparse.EntryUnit:
87 | mName, mUnit := p.Unit()
88 | metrics.add(generator.Metric{Name: string(mName), Unit: generator.MetricUnit(mUnit)})
89 | case textparse.EntrySeries:
90 | m, _, _ := p.Series()
91 | metrics.add(generator.Metric{Name: strings.Split(string(m), "{")[0]})
92 | default:
93 | }
94 | }
95 | metrics.addHistograms(histograms)
96 | return metrics.finalMetrics(), nil
97 | }
98 |
--------------------------------------------------------------------------------
/pkg/prometheus/api_fetcher.go:
--------------------------------------------------------------------------------
1 | package prometheus
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "net/http"
7 | "regexp"
8 | "time"
9 |
10 | "github.com/fusakla/autograf/pkg/generator"
11 | "github.com/prometheus/client_golang/api"
12 | v1 "github.com/prometheus/client_golang/api/prometheus/v1"
13 | "github.com/prometheus/common/model"
14 | "github.com/sirupsen/logrus"
15 | )
16 |
17 | var (
18 | specialSuffixRegexp = regexp.MustCompile(`(.+)_(total|info|sum|count|bucket)`)
19 | )
20 |
21 | func stripSpecialSuffixes(metricName string) string {
22 | return specialSuffixRegexp.ReplaceAllString(metricName, "$1")
23 | }
24 |
25 | func NewClient(logger logrus.FieldLogger, prometheusURL string, transport http.RoundTripper) (*Client, error) {
26 | cfg := api.Config{Address: prometheusURL}
27 | if transport != nil {
28 | cfg.RoundTripper = transport
29 | }
30 | cli, err := api.NewClient(cfg)
31 | if err != nil {
32 | return nil, err
33 | }
34 | return &Client{
35 | logger: logger,
36 | v1api: v1.NewAPI(cli),
37 | }, nil
38 | }
39 |
40 | type Client struct {
41 | v1api v1.API
42 | logger logrus.FieldLogger
43 | }
44 |
45 | func (c *Client) queryMetricsMetadata(ctx context.Context) (map[string][]v1.Metadata, error) {
46 | c.logger.Info("querying prometheus metric metadata")
47 | res, err := c.v1api.Metadata(ctx, "", "")
48 | if err != nil {
49 | return nil, err
50 | }
51 | return res, nil
52 | }
53 |
54 | func (c *Client) queryMetricsForSelector(ctx context.Context, selector string) ([]*model.Sample, error) {
55 | query := fmt.Sprintf("group(%s) by (__name__)", selector)
56 | c.logger.WithField("query", query).Info("querying prometheus")
57 | res, warnings, err := c.v1api.Query(ctx, query, time.Now())
58 | if err != nil {
59 | return nil, err
60 | }
61 | if len(warnings) > 0 {
62 | c.logger.WithField("warnings", warnings).Warn("encountered warnings while querying Prometheus")
63 | }
64 | switch r := res.(type) {
65 | case model.Vector:
66 | return r, nil
67 | default:
68 | return nil, fmt.Errorf("unexpected result type %s expected vector", res.Type().String())
69 | }
70 | }
71 |
72 | func (c *Client) MetricsForSelector(ctx context.Context, selector string) (map[string]*generator.Metric, error) {
73 | samples, err := c.queryMetricsForSelector(ctx, selector)
74 | if err != nil {
75 | return nil, err
76 | }
77 | metadata, err := c.queryMetricsMetadata(ctx)
78 | if err != nil {
79 | return nil, err
80 | }
81 | metrics := map[string]*generator.Metric{}
82 | for _, s := range samples {
83 | metricName := string(s.Metric["__name__"])
84 | metricMetadata, ok := metadata[stripSpecialSuffixes(metricName)]
85 | if !ok {
86 | metricMetadata = metadata[metricName]
87 | }
88 | if len(metricMetadata) > 0 {
89 | metrics[metricName] = &generator.Metric{
90 | Name: metricName,
91 | MetricType: generator.MetricType(metricMetadata[0].Type),
92 | Help: metricMetadata[0].Help,
93 | Unit: generator.MetricUnit(metricMetadata[0].Unit),
94 | }
95 | } else {
96 | metrics[metricName] = &generator.Metric{
97 | Name: metricName,
98 | }
99 | }
100 | }
101 | return metrics, nil
102 | }
103 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 | All notable changes to this project will be documented in this file.
3 |
4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6 |
7 | ## [Unreleased]
8 |
9 | ## [3.0.0] - 2025-07-25
10 | ### Changed
11 | - Switched from custom client to the grfana-openapi client https://github.com/grafana/grafana-openapi-client-go
12 | - Should fix weird issus with using different folders
13 | - Dashboards generated by Autograf will overwrite the old one (as it was supposed to be)
14 | - :tada: Switched to the new Grafana Foundation SDK https://grafana.github.io/grafana-foundation-sdk/
15 | - This may lead to some changes in the generated dashboards, please report any issues you encounter.
16 | - Formerly not working heatmap panel should now work correctly now.
17 | - Upgraded to Go 1.24
18 |
19 | ### Fixed
20 | - The `--version` flag now correctly prints the version, commit and date of the build
21 |
22 | ## [2.2.0] - 2023-07-14
23 | ### Added
24 | - New config option `prometheus_bearer_token` to allow authentication with Prometheus using a bearer token
25 | ### Changed
26 | - Upgraded to go 1.20
27 | - Upgraded all dependencies to newest versions
28 |
29 | ## [2.1.0] - 2023-05-06
30 | ### Added
31 | - New flag `--ignore-config | -i` to ignore any config file found
32 | - Updated demo example to newest grafana 9.5.1 and verified all works
33 | - Updated all dependencies to newest versions
34 | ### Fixed
35 | - Fix heatmap panel to not calculate the histogram buckets
36 |
37 | ## [2.0.1] - 2022-11-08
38 | ### Fixed
39 | - Fix heatmap panel query format to be valid
40 |
41 | ## [2.0.0] - 2022-11-06
42 | ### Added
43 | - Build binaries for darwin and windows (not tested, please do report if you encounter any issues!)
44 | - Config is now loaded also from location `~/.config.autograf.json` (Which config is used is printed to stderr to ease debugging)
45 | - Support more metric units (amper, hertz, volt, ...)
46 | - Experimental support for customization of the generated panels using the metric HELP text, see [the docs](./README.md#panel-config-customization-experimental)
47 | - Added demo in the [`./examples/demo`](./examples/demo/)
48 | - `--version` flag to print out Autograf version
49 | ### Changed
50 | - Optimized for the newest Grafana releases (9.2+)
51 | - Use the new heatmap Grafana panel
52 | - Switch range selector from `3m` to special Grafana variable `$__rate_interval`
53 | - Upgraded to Go 1.19
54 | - Ignore OpenMetrics `_created` metrics (for more info see [this](https://github.com/prometheus/prometheus/issues/6541) issue)
55 | - Handle metrics ending with `_time|_time_seconds|_timestamp|_timestamp_seconds` as timestamps in seconds and subtract them from `time()`
56 | - Improve layout of generated panels
57 | - Add metric names in the name of the row for better visibility
58 |
59 | ## [1.1.0] - 2022-08-12
60 | ### Added
61 | - Short flags for most common flags, see `--help` or [readme](https://github.com/fusakla/autograf#how-to-use)
62 | ### Fixed
63 | - Correctly handle metric selectors if no `--selector` is set
64 | ### Changed
65 | - Metric with unknown type is now visualized as gauge in time series panel as "best effort"
66 |
67 | ## [1.0.1] - 2022-07-12
68 | - Fixed default folder name
69 |
70 | ## [1.0.0] - 2022-07-12
71 | Initial release
72 |
--------------------------------------------------------------------------------
/pkg/grafana/dashboard.go:
--------------------------------------------------------------------------------
1 | package grafana
2 |
3 | import (
4 | "fmt"
5 | "slices"
6 | "strings"
7 |
8 | "github.com/fusakla/autograf/pkg/generator"
9 | "github.com/grafana/grafana-foundation-sdk/go/cog"
10 | "github.com/grafana/grafana-foundation-sdk/go/dashboard"
11 | )
12 |
13 | func newRow(dataSource dashboard.DataSourceRef, selector string, name string, metrics []*generator.Metric) cog.Builder[dashboard.RowPanel] {
14 | row := dashboard.NewRowBuilder(name).Collapsed(true)
15 | metricNames := []string{}
16 | metricNamesChars := 0
17 | trimMetricNames := false
18 | panels := []cog.Builder[dashboard.Panel]{}
19 | for _, m := range metrics {
20 | mName := strings.TrimPrefix(m.Name, name)
21 | if metricNamesChars+len(mName) < 150 {
22 | metricNames = append(metricNames, mName)
23 | metricNamesChars += len(mName)
24 | } else {
25 | trimMetricNames = true
26 | }
27 | if len(metrics) == 1 {
28 | m.Config.Width = 12
29 | }
30 | panel, isInfo := newPanel(dataSource, selector, *m)
31 | if isInfo {
32 | panels = append([]cog.Builder[dashboard.Panel]{panel}, panels...)
33 | } else {
34 | panels = append(panels, panel)
35 | }
36 | }
37 | for _, p := range panels {
38 | row = row.WithPanel(p)
39 | }
40 | if len(metricNames) > 1 {
41 | newTitle := name + " ❯ " + strings.Join(metricNames, " ❙ ")
42 | if trimMetricNames {
43 | newTitle += " | ..."
44 | }
45 | row = row.Title(newTitle)
46 | }
47 | return row
48 | }
49 |
50 | func selectorWithVariablesFilter(selector string, filerVariables []string) string {
51 | new := strings.TrimSuffix(selector, "}") + ","
52 | if selector == "" {
53 | new = "{"
54 | }
55 | filters := make([]string, len(filerVariables))
56 | for i, v := range filerVariables {
57 | filters[i] = fmt.Sprintf("%s=~'$%s'", v, v)
58 | }
59 | return new + strings.Join(filters, ",") + "}"
60 | }
61 |
62 | func labelVariable(datasource dashboard.DataSourceRef, selector, name string) *dashboard.QueryVariableBuilder {
63 | if selector == "" {
64 | selector = "up"
65 | }
66 | return dashboard.NewQueryVariableBuilder(name).
67 | Datasource(datasource).
68 | Query(dashboard.StringOrMap{String: cog.ToPtr(fmt.Sprintf("label_values(%s, %s)", selector, name))}).
69 | // Regex(fmt.Sprintf(`/%s="([^"]+)"/`, name)).
70 | AllValue(".*").
71 | IncludeAll(true).
72 | Multi(true).
73 | Sort(dashboard.VariableSortAlphabeticalAsc).
74 | Refresh(dashboard.VariableRefreshOnTimeRangeChanged)
75 | }
76 |
77 | func NewDashboard(name, datasourceID, selector string, filterVariables []string, pseudoDashboard generator.PseudoDashboard) *dashboard.DashboardBuilder {
78 | board := dashboard.NewDashboardBuilder(name).
79 | Refresh("1m").
80 | Tooltip(dashboard.DashboardCursorSyncCrosshair).
81 | Tags([]string{"autograf", "generated"}).
82 | Time("now-1h", "now").
83 | Timezone("browser").
84 | WithVariable(
85 | dashboard.NewDatasourceVariableBuilder("datasource").
86 | Label("Datasource").
87 | Type("prometheus").
88 | Current(dashboard.VariableOption{
89 | Value: dashboard.StringOrArrayOfString{String: cog.ToPtr(datasourceID)},
90 | Selected: cog.ToPtr(true),
91 | }),
92 | )
93 | datasource := dashboard.DataSourceRef{Type: cog.ToPtr("prometheus"), Uid: cog.ToPtr("${datasource}")}
94 |
95 | for _, v := range filterVariables {
96 | board = board.WithVariable(labelVariable(datasource, selector, v))
97 | }
98 | rowNames := make([]string, 0, len(pseudoDashboard.Rows))
99 | for k := range pseudoDashboard.Rows {
100 | rowNames = append(rowNames, k)
101 | }
102 | slices.Sort(rowNames)
103 | for _, r := range rowNames {
104 | board = board.WithRow(newRow(datasource, selectorWithVariablesFilter(selector, filterVariables), r, pseudoDashboard.Rows[r].Metrics))
105 | }
106 | return board
107 | }
108 |
--------------------------------------------------------------------------------
/generate.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "context"
5 | "encoding/json"
6 | "fmt"
7 | "io"
8 | "net/http"
9 | "os"
10 | "os/exec"
11 | "runtime"
12 | "strings"
13 | "time"
14 |
15 | "github.com/fusakla/autograf/pkg/generator"
16 | "github.com/fusakla/autograf/pkg/grafana"
17 | "github.com/fusakla/autograf/pkg/prometheus"
18 | "github.com/grafana/grafana-foundation-sdk/go/cog"
19 | "github.com/grafana/grafana-foundation-sdk/go/dashboard"
20 | )
21 |
22 | type AuthenticatedTransport struct {
23 | http.RoundTripper
24 | bearerToken string
25 | }
26 |
27 | func (at *AuthenticatedTransport) RoundTrip(req *http.Request) (*http.Response, error) {
28 | req.Header.Add("Authorization", "Bearer "+at.bearerToken)
29 | return at.RoundTripper.RoundTrip(req)
30 | }
31 |
32 | func openInBrowser(url string) error {
33 | var err error
34 | switch runtime.GOOS {
35 | case "linux":
36 | err = exec.Command("xdg-open", url).Start()
37 | case "windows":
38 | err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
39 | case "darwin":
40 | err = exec.Command("open", url).Start()
41 | }
42 | return err
43 | }
44 |
45 | func (r *Command) Run(ctx *Context) error {
46 | var metrics map[string]*generator.Metric
47 | if r.MetricsFile != "" {
48 | var data []byte
49 | var err error
50 | if r.MetricsFile == "-" {
51 | data, err = io.ReadAll(os.Stdin)
52 | } else {
53 | data, err = os.ReadFile(strings.TrimSpace(r.MetricsFile))
54 | }
55 | if err != nil {
56 | return err
57 | }
58 | metrics, err = prometheus.ParseMetricsText(data, r.OpenMetricsFormat)
59 | if err != nil {
60 | return err
61 | }
62 | } else if r.PrometheusURL != "" {
63 | tr := http.DefaultTransport
64 | if r.PrometheusBearerToken != "" {
65 | tr = &AuthenticatedTransport{RoundTripper: tr, bearerToken: r.PrometheusBearerToken}
66 | }
67 | client, err := prometheus.NewClient(ctx.logger, strings.TrimSpace(r.PrometheusURL), tr)
68 | if err != nil {
69 | return err
70 | }
71 | ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
72 | defer cancel()
73 | metrics, err = client.MetricsForSelector(ctx, strings.TrimSpace(r.Selector))
74 | if err != nil {
75 | return err
76 | }
77 | } else {
78 | return fmt.Errorf("at least one of inputs metrics file or Prometheus URL is required")
79 | }
80 | if err := prometheus.ProcessMetrics(metrics); err != nil {
81 | return err
82 | }
83 | pseudoDashboard := generator.NewPseudoDashboardFromMetrics(metrics)
84 | grafanaDashboard := grafana.NewDashboard(strings.TrimSpace(r.GrafanaDashboardName), strings.TrimSpace(r.GrafanaDataSource), strings.TrimSpace(r.Selector), r.GrafanaVariables, pseudoDashboard)
85 | if grafanaDashboard == nil {
86 | return fmt.Errorf("error creating Grafana dashboard")
87 | }
88 | renderedGrafanaDashboard, err := grafanaDashboard.Build()
89 | if err != nil {
90 | return fmt.Errorf("error building Grafana dashboard: %w", err)
91 | }
92 | if r.GrafanaURL != "" {
93 | if r.grafanaToken == "" {
94 | return fmt.Errorf("you have to specify the GRAFANA_TOKEN variable")
95 | }
96 | cli := grafana.NewClient(r.GrafanaURL, r.grafanaToken)
97 | folderUid, err := cli.EnsureFolder(strings.TrimSpace(r.GrafanaFolder))
98 | if err != nil {
99 | return err
100 | }
101 |
102 | // To make datasource variable work, we need to set also the datasource ID not just name.
103 | datasourceID, err := cli.DatasourceIDByName(strings.TrimSpace(r.GrafanaDataSource))
104 | if err != nil {
105 | return fmt.Errorf("error getting datasource ID: %w", err)
106 | }
107 | for i, tv := range renderedGrafanaDashboard.Templating.List {
108 | if tv.Type == "datasource" {
109 | renderedGrafanaDashboard.Templating.List[i].Current.Value = dashboard.StringOrArrayOfString{String: cog.ToPtr(datasourceID)}
110 | }
111 | }
112 |
113 | dashboardUrl, err := cli.UpsertDashboard(folderUid, renderedGrafanaDashboard)
114 | if err != nil {
115 | return err
116 | }
117 | fmt.Println("Dashboard successfully generated, see " + dashboardUrl)
118 | if r.OpenBrowser {
119 | if err := openInBrowser(dashboardUrl); err != nil {
120 | return err
121 | }
122 | }
123 | } else {
124 | jsonData, err := json.Marshal(renderedGrafanaDashboard)
125 | if err != nil {
126 | return err
127 | }
128 | fmt.Println(string(jsonData))
129 | }
130 | return nil
131 | }
132 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/alecthomas/kong"
8 | "github.com/sirupsen/logrus"
9 | )
10 |
11 | var (
12 | // Set by goreleaser during the build, see https://goreleaser.com/cookbooks/using-main.version/
13 | version = "dev"
14 | commit = "none"
15 | date = "unknown"
16 | )
17 |
18 | type Context struct {
19 | logger logrus.FieldLogger
20 | }
21 |
22 | var help = `
23 | Autograf generates Grafana dashboard from Prometheus metrics either read from a /metrics endpoint or queried from live Prometheus instance.
24 | The dashboard JSON is by default printed to stdout. But can also upload the dashboard directly to your Grafana instance.
25 | You can configure most of the flags using config file. See the docs.
26 |
27 | Example from /metrics:
28 | curl http://foo.bar/metrics | autograf --metrics-file -
29 |
30 | Example from Prometheus query:
31 | GRAFANA_TOKEN=xxx autograf --prometheus-url http://prometheus.foo --selector '{app="foo"}' --grafana-url http://grafana.bar
32 |
33 | `
34 |
35 | type Command struct {
36 | Debug bool `help:"Enable debug logging"`
37 | Version bool `help:"Print Autograf version and exit"`
38 | IgnoreConfig bool `short:"i" help:"Ignore any config file"`
39 |
40 | MetricsFile string `short:"f" help:"File containing the metrics exposed by app (will read stdin if se to - )"`
41 | OpenMetricsFormat bool `help:"Metrics data are in the application/openmetrics-text format."`
42 |
43 | PrometheusURL string `short:"p" help:"URL of Prometheus instance to fetch the metrics from."`
44 | PrometheusBearerToken string `help:"Bearer token to use for authentication with Prometheus instance."`
45 | Selector string `short:"s" help:"Selector to filter metrics from the Prometheus instance."`
46 | GrafanaVariables []string `help:"Labels used as a variables for filtering in dashboard"`
47 |
48 | GrafanaURL string `help:"URL of Grafana to upload the dashboard to, if not specified, dashboard JSON is printed to stdout"`
49 | GrafanaFolder string `help:"Name of target Grafana folder"`
50 | GrafanaDashboardName string `help:"Name of the Grafana dashboard"`
51 | GrafanaDataSource string `help:"Name of the Grafana datasource to use"`
52 |
53 | OpenBrowser bool `help:"Open the Grafana dashboard automatically in browser"`
54 |
55 | grafanaToken string `kong:"-"`
56 | }
57 |
58 | func (c *Command) updateFromConfig(conf config) {
59 | if c.PrometheusURL == "" {
60 | c.PrometheusURL = conf.PrometheusURL
61 | }
62 | if c.PrometheusBearerToken == "" {
63 | c.PrometheusBearerToken = conf.PrometheusBearerToken
64 | }
65 | if c.GrafanaURL == "" {
66 | c.GrafanaURL = conf.GrafanaURL
67 | }
68 | if c.GrafanaFolder == "" {
69 | c.GrafanaFolder = conf.GrafanaFolder
70 | if c.GrafanaFolder == "" {
71 | c.GrafanaFolder = "Autograf"
72 | }
73 | }
74 | if c.GrafanaDashboardName == "" {
75 | c.GrafanaDashboardName = conf.GrafanaDashboardName
76 | if c.GrafanaDashboardName == "" {
77 | c.GrafanaDashboardName = "Autograf dashboard"
78 | }
79 | }
80 | if c.GrafanaDataSource == "" {
81 | c.GrafanaDataSource = conf.GrafanaDataSource
82 | }
83 | if c.grafanaToken == "" {
84 | c.grafanaToken = conf.GrafanaToken
85 | }
86 | if !c.OpenBrowser && conf.OpenBrowser {
87 | c.OpenBrowser = true
88 | }
89 | if len(c.GrafanaVariables) == 0 {
90 | c.GrafanaVariables = conf.GrafanaVariables
91 | if len(c.GrafanaVariables) == 0 {
92 | c.GrafanaVariables = []string{"job", "instance"}
93 | }
94 | }
95 | }
96 |
97 | var CLI Command
98 |
99 | func main() {
100 | ctx := kong.Parse(&CLI, kong.Description(help))
101 | rootLogger := logrus.New()
102 | rootLogger.SetOutput(os.Stderr)
103 | rootLogger.SetLevel(logrus.WarnLevel)
104 | if CLI.Debug {
105 | rootLogger.SetLevel(logrus.DebugLevel)
106 | }
107 | if CLI.Version {
108 | fmt.Println("Autograf version: " + version + " (commit: " + commit + ", date: " + date + ")")
109 | os.Exit(0)
110 | }
111 | CLI.grafanaToken = os.Getenv("GRAFANA_TOKEN")
112 | if !CLI.IgnoreConfig {
113 | CLI.updateFromConfig(loadConfig(rootLogger))
114 | }
115 |
116 | if CLI.PrometheusURL == "" && CLI.MetricsFile == "" {
117 | rootLogger.Error("Error, at leas one of the --prometheus-url or --metrics-file flags have to be set")
118 | os.Exit(1)
119 | }
120 |
121 | err := ctx.Run(&Context{
122 | logger: rootLogger.WithField("command", ctx.Command()),
123 | })
124 | ctx.FatalIfErrorf(err)
125 | }
126 |
--------------------------------------------------------------------------------
/pkg/grafana/panel.go:
--------------------------------------------------------------------------------
1 | package grafana
2 |
3 | import (
4 | "fmt"
5 | "regexp"
6 |
7 | "github.com/fusakla/autograf/pkg/generator"
8 | "github.com/grafana/grafana-foundation-sdk/go/cog"
9 | "github.com/grafana/grafana-foundation-sdk/go/common"
10 | "github.com/grafana/grafana-foundation-sdk/go/dashboard"
11 | "github.com/grafana/grafana-foundation-sdk/go/heatmap"
12 | "github.com/grafana/grafana-foundation-sdk/go/prometheus"
13 | "github.com/grafana/grafana-foundation-sdk/go/table"
14 | "github.com/grafana/grafana-foundation-sdk/go/timeseries"
15 | )
16 |
17 | const (
18 | timeSeriesFormat = "time_series"
19 | panelHeightCoeficient = 1
20 | rateIntervalVariable = "$__rate_interval"
21 | )
22 |
23 | func panelNameFromQuery(query string) string {
24 | return regexp.MustCompile(`\{[^{}]*\}`).ReplaceAllString(query, "")
25 | }
26 |
27 | func addLimitTarget(panel *timeseries.PanelBuilder, lType generator.LimitType, metric string, selector string) {
28 | panel.WithTarget(prometheus.NewDataqueryBuilder().
29 | RefId(metric).
30 | Expr(generator.ThresholdQuery(metric, selector, lType)).
31 | Range().
32 | LegendFormat(fmt.Sprintf("%s limit", lType)).
33 | Format(prometheus.PromQueryFormatTimeSeries),
34 | ).OverrideByName(metric, []dashboard.DynamicConfigValue{
35 | {Id: "custom.fillOpacity", Value: 0},
36 | {Id: "color", Value: map[string]string{"mode": "fixed", "fixedColor": "red"}},
37 | {Id: "custom.lineWidth", Value: 3},
38 | {Id: "custom.lineStyle", Value: map[string]string{"fill": "dash"}},
39 | })
40 | }
41 |
42 | func newTimeSeriesPanel(dataSource dashboard.DataSourceRef, selector string, metric generator.Metric) cog.Builder[dashboard.Panel] {
43 | query := metric.PromQlQuery(selector, rateIntervalVariable)
44 | panel := timeseries.NewPanelBuilder().
45 | Title(panelNameFromQuery(query)).
46 | Description(metric.Help).
47 | Datasource(dataSource).
48 | Legend(common.NewVizLegendOptionsBuilder().
49 | DisplayMode(common.LegendDisplayModeTable).
50 | Calcs(metric.Config.LegendCalcs).
51 | ShowLegend(false)).
52 | Unit(string(metric.Unit)).
53 | Tooltip(common.NewVizTooltipOptionsBuilder().
54 | Mode(common.TooltipDisplayModeSingle).
55 | Sort(common.SortOrderDescending),
56 | ).LineWidth(float64(metric.Config.LineWidth)).
57 | LineStyle(common.NewLineStyleBuilder().
58 | Fill("solid"),
59 | ).DrawStyle("line").
60 | ShowPoints("auto").
61 | PointSize(1).
62 | Span(uint32(metric.Config.Width)).
63 | Height(uint32(metric.Config.Height * panelHeightCoeficient))
64 |
65 | if metric.Config.Stack {
66 | panel.Stacking(common.NewStackingConfigBuilder().Mode("normal"))
67 | }
68 |
69 | switch metric.Config.Scale {
70 | case "linear":
71 | panel.ScaleDistribution(common.NewScaleDistributionConfigBuilder().Type(common.ScaleDistributionLinear))
72 | case "log2":
73 | panel.ScaleDistribution(common.NewScaleDistributionConfigBuilder().Type(common.ScaleDistributionLog).Log(2))
74 | case "log10":
75 | panel.ScaleDistribution(common.NewScaleDistributionConfigBuilder().Type(common.ScaleDistributionLog).Log(10))
76 | }
77 |
78 | panel.WithTarget(prometheus.NewDataqueryBuilder().Datasource(dataSource).
79 | RefId(metric.Name).
80 | Expr(query).
81 | Range().
82 | Format(prometheus.PromQueryFormatTimeSeries),
83 | )
84 |
85 | if metric.Config.MaxFromMetric != "" {
86 | addLimitTarget(panel, generator.LimitMax, metric.Config.MaxFromMetric, selector)
87 | }
88 | if metric.Config.MinFromMetric != "" {
89 | addLimitTarget(panel, generator.LimitMin, metric.Config.MinFromMetric, selector)
90 | }
91 |
92 | return panel
93 | }
94 |
95 | func newHeatmapPanel(dataSource dashboard.DataSourceRef, selector string, metric generator.Metric) cog.Builder[dashboard.Panel] {
96 | query := metric.PromQlQuery(selector, rateIntervalVariable)
97 |
98 | panel := heatmap.NewPanelBuilder().
99 | Title(panelNameFromQuery(query)).
100 | Description(metric.Help).
101 | Unit(string(metric.Unit)).
102 | Datasource(dataSource).
103 | ShowLegend().
104 | Calculate(false).
105 | Color(heatmap.NewHeatmapColorOptionsBuilder().
106 | Mode(heatmap.HeatmapColorModeOpacity).
107 | Exponent(0.3).
108 | Steps(20).
109 | Fill("super-light-blue"),
110 | ).
111 | ShowColorScale(true).
112 | ShowYHistogram().
113 | YAxis(heatmap.NewYAxisConfigBuilder().
114 | AxisPlacement("left").
115 | Unit(string(metric.Unit)),
116 | ).
117 | CellGap(1).
118 | CellValues(heatmap.NewCellValuesBuilder().
119 | Unit(string(metric.Unit)),
120 | ).
121 | Span(uint32(metric.Config.Width)).
122 | Height(uint32(metric.Config.Height * panelHeightCoeficient))
123 |
124 | panel.WithTarget(prometheus.NewDataqueryBuilder().
125 | Datasource(dataSource).
126 | RefId(metric.Name).
127 | Expr(query).
128 | Range().
129 | Format(prometheus.PromQueryFormatHeatmap).
130 | LegendFormat("{{le}}"),
131 | )
132 |
133 | return panel
134 | }
135 |
136 | func newInfoPanel(dataSource dashboard.DataSourceRef, selector string, metric generator.Metric) cog.Builder[dashboard.Panel] {
137 | panel := table.NewPanelBuilder().
138 | DisplayName(panelNameFromQuery(metric.Name)).
139 | Description(metric.Help).
140 | OverrideByRegexp(
141 | "(__name__|Time|Value)",
142 | []dashboard.DynamicConfigValue{{Id: "custom.hidden", Value: true}},
143 | ).
144 | Span(24).
145 | Height(uint32(metric.Config.Height * panelHeightCoeficient)).
146 | WithTarget(prometheus.NewDataqueryBuilder().
147 | Datasource(dataSource).
148 | RefId(metric.Name).
149 | Expr(metric.PromQlQuery(selector, rateIntervalVariable)).
150 | Instant().
151 | Format(prometheus.PromQueryFormatTable),
152 | )
153 | return panel
154 | }
155 |
156 | func newPanel(dataSource dashboard.DataSourceRef, selector string, metric generator.Metric) (cog.Builder[dashboard.Panel], bool) {
157 | switch metric.MetricType {
158 | case "gauge":
159 | return newTimeSeriesPanel(dataSource, selector, metric), false
160 | case "counter":
161 | return newTimeSeriesPanel(dataSource, selector, metric), false
162 | case "summary":
163 | return newTimeSeriesPanel(dataSource, selector, metric), false
164 | case "histogram":
165 | return newHeatmapPanel(dataSource, selector, metric), false
166 | case "info":
167 | return newInfoPanel(dataSource, selector, metric), true
168 | }
169 | metric.Help = fmt.Sprintf("WARNING: Unknown metric type %s!\n\n%s", metric.MetricType, metric.Help)
170 | return newTimeSeriesPanel(dataSource, selector, metric), false
171 | }
172 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Autograf
2 | [](https://goreportcard.com/report/github.com/fusakla/autograf)
4 | [](https://github.com/fusakla/autograf/actions?query=branch%3Amain)
6 | [](https://hub.docker.com/r/fusakla/autograf)
7 | [](https://github.com/fusakla/autograf/releases/latest)
9 |
10 | **Dynamically generate Grafana dashboard based on Prometheus metrics**
11 |
12 |

13 |
14 | Have you ever needed to debug issues and ended up querying Prometheus for `group({app="foo"}) by (__name__)` to find out
15 | what metrics the app exposes and than querying all of them fo find anything suspicious? Or do you often encounter apps
16 | that do not have any official dashboard?
17 |
18 | _Well I have a good news for you, Autograf have you covered!_ :tada:
19 |
20 | ## How does it work?
21 | Autograf generates Grafana dashboard directly from `/metrics` or based on a metrics matching provided selector. Each
22 | metric has own panel optimized for its type and those are grouped based on metric namespacing. If you want Autograf can
23 | even upload the dashboard right your to a Grafana for you!
24 |
25 | [autograf-2.webm](https://user-images.githubusercontent.com/6112562/178546235-7f9f815d-e843-4b0c-84dc-4fba2270eedc.webm)
26 |
27 | ## Installation
28 | Using [prebuilt binaries](https://github.com/fusakla/autograf/releases/latest), [Docker
29 | image](https://hub.docker.com/r/fusakla/autograf) of build it yourself.
30 |
31 | ```bash
32 | go install github.com/fusakla/autograf@latest
33 | ```
34 | or
35 | ```bash
36 | make build
37 | ```
38 |
39 | ## Example
40 | To see Autograf in action you can use the [demo example](./examples/demo/README.md). It is a simple docker-compose
41 | that starts up Prometheus, Node exporter and Grafana. The Grafana instance is pre-configured with a datasource
42 | pointing to the Proemtheus and service account. There is also an autograf.json config preset to test it with the setup.
43 | See it's README for more details.
44 |
45 | ## How to use?
46 |
47 | ```bash
48 | ./autograf --help
49 | Usage: autograf
50 |
51 | Autograf generates Grafana dashboard from Prometheus metrics either read from a /metrics endpoint or queried from live Prometheus instance. The dashboard JSON is by default printed to stdout. But can also upload the dashboard directly to
52 | your Grafana instance. You can configure most of the flags using config file. See the docs.
53 |
54 | Example from /metrics:
55 |
56 | curl http://foo.bar/metrics | autograf --metrics-file -
57 |
58 | Example from Prometheus query:
59 |
60 | GRAFANA_TOKEN=xxx autograf --prometheus-url http://prometheus.foo --selector '{app="foo"}' --grafana-url http://grafana.bar
61 |
62 | Flags:
63 | -h, --help Show context-sensitive help.
64 | --debug Enable debug logging
65 | --version Print Autograf version and exit
66 | -i, --ignore-config Ignore any config file
67 | -f, --metrics-file=STRING File containing the metrics exposed by app (will read stdin if se to - )
68 | --open-metrics-format Metrics data are in the application/openmetrics-text format.
69 | -p, --prometheus-url=STRING URL of Prometheus instance to fetch the metrics from.
70 | --prometheus-bearer-token=STRING Bearer token to use for authentication with Prometheus instance.
71 | -s, --selector=STRING Selector to filter metrics from the Prometheus instance.
72 | --grafana-variables=GRAFANA-VARIABLES,... Labels used as a variables for filtering in dashboard
73 | --grafana-url=STRING URL of Grafana to upload the dashboard to, if not specified, dashboard JSON is printed to stdout
74 | --grafana-folder=STRING Name of target Grafana folder
75 | --grafana-dashboard-name=STRING Name of the Grafana dashboard
76 | --grafana-data-source=STRING Name of the Grafana datasource to use
77 | --open-browser Open the Grafana dashboard automatically in browser
78 | ```
79 |
80 | ### Loading data from all metrics exposed by app
81 | ```bash
82 | curl -q https://prometheus.demo.prometheus.io/metrics | ./autograf --metrics-file -
83 | ```
84 |
85 | ### Loading data from live Prometheus instance
86 | Print Grafana dashboard JSON for all metrics matching selector `{instance="demo.do.prometheus.io:9090",
87 | job="prometheus"}` from the configured Prometheus instance.
88 | ```bash
89 | autograf --prometheus-url https://prometheus.demo.prometheus.io --selector '{instance="demo.do.prometheus.io:9090", job="prometheus"}'
90 | ```
91 |
92 | ### Uploading dashboard directly to Grafana
93 | ```bash
94 | GRAFANA_TOKEN="xxx" autograf --prometheus-url https://prometheus.demo.prometheus.io --selector '{instance="demo.do.prometheus.io:9090", job="prometheus"}' --grafana-url https://foo.bar --grafana-folder test
95 | Dashboard successfully generated, see https://grafana.foo.bar/d/ygUo8se7k/autograf-dashboard
96 | ```
97 |
98 | ## Config file
99 | If you do not want to set all the flags again and again you can use a config file. By default autograf looks for it in
100 | `~/.autograf.json` and `~/.config/autograf.json` but can be changed using the `AUTOGRAF_CONFIG` env variable.
101 | See the [example](./examples/demo/autograf.json) used in the demo.
102 |
103 | ### Config file syntax
104 | ```json
105 | {
106 | "prometheus_url": "https://prometheus.demo.prometheus.io",
107 | "prometheus_bearer_token": "xxx",
108 |
109 | "grafana_url": "https://grafana.foo.bar",
110 | "grafana_dashboard_name": "Autograf",
111 | "grafana_folder": "FUSAKLAS garbage",
112 | "grafana_datasource": "Prometheus",
113 | "grafana_token": "xxx",
114 |
115 | "open_browser": true
116 | }
117 | ```
118 |
119 | Than you can use simply just this!
120 | ```bash
121 | autograf -s {job='foo'}
122 | ```
123 |
124 | ## Panel config customization (EXPERIMENTAL)
125 | This feature allows you to customize how the panel will look like using the metric HELP text.
126 | To use it include in the and of the metric HELP string ` AUTOGRAF:{...}` where the supported JSON options
127 | can be found in the [`PanelConfig`](./packages/model/panel_config.go#L10). Example of such metric HELP can
128 | be found in the [`./examples/metrics_custom.txt`](./examples/metrics_custom.txt).
129 |
130 |
131 | ## Future ideas
132 | - **Autograf should actually be Grafana app plugin and user could just go to `https://grafana.foo.bar/autograf?selector={foo="bar"}` and
133 | the dashboard would show up right in the Grafana itself. Unfortunately my JS juju is not good enough for this.**
134 | - Add custom visuals for well known metrics.
135 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU=
2 | github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
3 | github.com/alecthomas/kong v0.9.0 h1:G5diXxc85KvoV2f0ZRVuMsi45IrBgx9zDNGNj165aPA=
4 | github.com/alecthomas/kong v0.9.0/go.mod h1:Y47y5gKfHp1hDc7CH7OeXgLIpp+Q2m1Ni0L5s3bI8Os=
5 | github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
6 | github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
7 | github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
8 | github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
9 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
10 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
11 | github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
12 | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
15 | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
16 | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
17 | github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
18 | github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
19 | github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
20 | github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
21 | github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
22 | github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
23 | github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
24 | github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
25 | github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
26 | github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
27 | github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
28 | github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
29 | github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
30 | github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
31 | github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
32 | github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
33 | github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
34 | github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
35 | github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
36 | github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
37 | github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
38 | github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
39 | github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
40 | github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
41 | github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
42 | github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
43 | github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
44 | github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
45 | github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
46 | github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
47 | github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
48 | github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
49 | github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
50 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
51 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
52 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
53 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
54 | github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao=
55 | github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
56 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
57 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
58 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
59 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
60 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
61 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
62 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
63 | github.com/gosimple/slug v1.15.0 h1:wRZHsRrRcs6b0XnxMUBM6WK1U1Vg5B0R7VkIf1Xzobo=
64 | github.com/gosimple/slug v1.15.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
65 | github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o=
66 | github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc=
67 | github.com/grafana/grafana-foundation-sdk/go v0.0.0-20250613155137-bade83b30287 h1:mWzUzhwRhkPhObb+ODA/xp9pXoetTagmaJCuohSxlGc=
68 | github.com/grafana/grafana-foundation-sdk/go v0.0.0-20250613155137-bade83b30287/go.mod h1:48EA8jF85SrReYflLa39Sk34b6NpxwJPBwjF3TJgRpE=
69 | github.com/grafana/grafana-openapi-client-go v0.0.0-20250108132429-8d7e1f158f65 h1:AnfwjPE8TXJO8CX0Q5PvtzGta9Ls3iRASWVV4jHl4KA=
70 | github.com/grafana/grafana-openapi-client-go v0.0.0-20250108132429-8d7e1f158f65/go.mod h1:hiZnMmXc9KXNUlvkV2BKFsiWuIFF/fF4wGgYWEjBitI=
71 | github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248=
72 | github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
73 | github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
74 | github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
75 | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
76 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
77 | github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
78 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
79 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
80 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
81 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
82 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
83 | github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
84 | github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
85 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
86 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
87 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
88 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
89 | github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
90 | github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
91 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
92 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
93 | github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
94 | github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
95 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
96 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
97 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
98 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
99 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
100 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
101 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
102 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
103 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
104 | github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
105 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
106 | github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
107 | github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
108 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
109 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
110 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
111 | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
112 | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
113 | github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg=
114 | github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
115 | github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
116 | github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
117 | github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
118 | github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
119 | github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
120 | github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
121 | github.com/prometheus/prometheus v0.54.0 h1:6+VmEkohHcofl3W5LyRlhw1Lfm575w/aX6ZFyVAmzM0=
122 | github.com/prometheus/prometheus v0.54.0/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY=
123 | github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
124 | github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
125 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
126 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
127 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
128 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
129 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
130 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
131 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
132 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
133 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
134 | go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
135 | go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
136 | go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
137 | go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
138 | go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
139 | go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
140 | go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
141 | go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
142 | go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
143 | go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
144 | go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
145 | go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
146 | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
147 | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
148 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
149 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
150 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
151 | golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
152 | golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
153 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
154 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
155 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
156 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
157 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
158 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
159 | golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
160 | golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
161 | golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
162 | golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
163 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
164 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
165 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
166 | golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
167 | golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
168 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
169 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
170 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
171 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
172 | golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
173 | golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
174 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
175 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
176 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
177 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
178 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
179 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
180 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
181 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
182 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
183 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
184 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
185 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
186 | google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
187 | google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
188 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
189 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
190 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
191 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
192 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
193 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
194 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
195 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
196 | gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
197 | gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
198 |
--------------------------------------------------------------------------------
/examples/metrics.txt:
--------------------------------------------------------------------------------
1 | # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
2 | # TYPE go_gc_duration_seconds summary
3 | go_gc_duration_seconds{quantile="0"} 8.4998e-05
4 | go_gc_duration_seconds{quantile="0.25"} 0.000134306
5 | go_gc_duration_seconds{quantile="0.5"} 0.000143983
6 | go_gc_duration_seconds{quantile="0.75"} 0.000171217
7 | go_gc_duration_seconds{quantile="1"} 0.002926023
8 | go_gc_duration_seconds_sum 1.20907564
9 | go_gc_duration_seconds_count 5427
10 | # HELP go_goroutines Number of goroutines that currently exist.
11 | # TYPE go_goroutines gauge
12 | go_goroutines 102
13 | # HELP go_info Information about the Go environment.
14 | # TYPE go_info gauge
15 | go_info{version="go1.16.4"} 1
16 | # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
17 | # TYPE go_memstats_alloc_bytes gauge
18 | go_memstats_alloc_bytes 1.02867032e+08
19 | # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
20 | # TYPE go_memstats_alloc_bytes_total counter
21 | go_memstats_alloc_bytes_total 3.02433813216e+11
22 | # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
23 | # TYPE go_memstats_buck_hash_sys_bytes gauge
24 | go_memstats_buck_hash_sys_bytes 4.239e+06
25 | # HELP go_memstats_frees_total Total number of frees.
26 | # TYPE go_memstats_frees_total counter
27 | go_memstats_frees_total 1.370434474e+09
28 | # HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started.
29 | # TYPE go_memstats_gc_cpu_fraction gauge
30 | go_memstats_gc_cpu_fraction 0.0038554208231384277
31 | # HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.
32 | # TYPE go_memstats_gc_sys_bytes gauge
33 | go_memstats_gc_sys_bytes 2.6732552e+07
34 | # HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.
35 | # TYPE go_memstats_heap_alloc_bytes gauge
36 | go_memstats_heap_alloc_bytes 1.02867032e+08
37 | # HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.
38 | # TYPE go_memstats_heap_idle_bytes gauge
39 | go_memstats_heap_idle_bytes 4.93658112e+08
40 | # HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
41 | # TYPE go_memstats_heap_inuse_bytes gauge
42 | go_memstats_heap_inuse_bytes 1.07077632e+08
43 | # HELP go_memstats_heap_objects Number of allocated objects.
44 | # TYPE go_memstats_heap_objects gauge
45 | go_memstats_heap_objects 651857
46 | # HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.
47 | # TYPE go_memstats_heap_released_bytes gauge
48 | go_memstats_heap_released_bytes 4.67017728e+08
49 | # HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system.
50 | # TYPE go_memstats_heap_sys_bytes gauge
51 | go_memstats_heap_sys_bytes 6.00735744e+08
52 | # HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
53 | # TYPE go_memstats_last_gc_time_seconds gauge
54 | go_memstats_last_gc_time_seconds 1.6573682159214406e+09
55 | # HELP go_memstats_lookups_total Total number of pointer lookups.
56 | # TYPE go_memstats_lookups_total counter
57 | go_memstats_lookups_total 0
58 | # HELP go_memstats_mallocs_total Total number of mallocs.
59 | # TYPE go_memstats_mallocs_total counter
60 | go_memstats_mallocs_total 1.371086331e+09
61 | # HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures.
62 | # TYPE go_memstats_mcache_inuse_bytes gauge
63 | go_memstats_mcache_inuse_bytes 1200
64 | # HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system.
65 | # TYPE go_memstats_mcache_sys_bytes gauge
66 | go_memstats_mcache_sys_bytes 16384
67 | # HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures.
68 | # TYPE go_memstats_mspan_inuse_bytes gauge
69 | go_memstats_mspan_inuse_bytes 919360
70 | # HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system.
71 | # TYPE go_memstats_mspan_sys_bytes gauge
72 | go_memstats_mspan_sys_bytes 5.537792e+06
73 | # HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place.
74 | # TYPE go_memstats_next_gc_bytes gauge
75 | go_memstats_next_gc_bytes 1.22448736e+08
76 | # HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations.
77 | # TYPE go_memstats_other_sys_bytes gauge
78 | go_memstats_other_sys_bytes 1.138152e+06
79 | # HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator.
80 | # TYPE go_memstats_stack_inuse_bytes gauge
81 | go_memstats_stack_inuse_bytes 3.244032e+06
82 | # HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator.
83 | # TYPE go_memstats_stack_sys_bytes gauge
84 | go_memstats_stack_sys_bytes 3.244032e+06
85 | # HELP go_memstats_sys_bytes Number of bytes obtained from system.
86 | # TYPE go_memstats_sys_bytes gauge
87 | go_memstats_sys_bytes 6.41643656e+08
88 | # HELP go_threads Number of OS threads created.
89 | # TYPE go_threads gauge
90 | go_threads 11
91 | # HELP net_conntrack_dialer_conn_attempted_total Total number of connections attempted by the given dialer a given name.
92 | # TYPE net_conntrack_dialer_conn_attempted_total counter
93 | net_conntrack_dialer_conn_attempted_total{dialer_name="alertmanager"} 10
94 | net_conntrack_dialer_conn_attempted_total{dialer_name="blackbox"} 7
95 | net_conntrack_dialer_conn_attempted_total{dialer_name="caddy"} 6
96 | net_conntrack_dialer_conn_attempted_total{dialer_name="default"} 0
97 | net_conntrack_dialer_conn_attempted_total{dialer_name="grafana"} 8
98 | net_conntrack_dialer_conn_attempted_total{dialer_name="node"} 7
99 | net_conntrack_dialer_conn_attempted_total{dialer_name="prometheus"} 7
100 | net_conntrack_dialer_conn_attempted_total{dialer_name="random"} 27
101 | # HELP net_conntrack_dialer_conn_closed_total Total number of connections closed which originated from the dialer of a given name.
102 | # TYPE net_conntrack_dialer_conn_closed_total counter
103 | net_conntrack_dialer_conn_closed_total{dialer_name="alertmanager"} 2
104 | net_conntrack_dialer_conn_closed_total{dialer_name="blackbox"} 1
105 | net_conntrack_dialer_conn_closed_total{dialer_name="caddy"} 1
106 | net_conntrack_dialer_conn_closed_total{dialer_name="default"} 0
107 | net_conntrack_dialer_conn_closed_total{dialer_name="grafana"} 1
108 | net_conntrack_dialer_conn_closed_total{dialer_name="node"} 1
109 | net_conntrack_dialer_conn_closed_total{dialer_name="prometheus"} 1
110 | net_conntrack_dialer_conn_closed_total{dialer_name="random"} 5
111 | # HELP net_conntrack_dialer_conn_established_total Total number of connections successfully established by the given dialer a given name.
112 | # TYPE net_conntrack_dialer_conn_established_total counter
113 | net_conntrack_dialer_conn_established_total{dialer_name="alertmanager"} 4
114 | net_conntrack_dialer_conn_established_total{dialer_name="blackbox"} 2
115 | net_conntrack_dialer_conn_established_total{dialer_name="caddy"} 2
116 | net_conntrack_dialer_conn_established_total{dialer_name="default"} 0
117 | net_conntrack_dialer_conn_established_total{dialer_name="grafana"} 2
118 | net_conntrack_dialer_conn_established_total{dialer_name="node"} 2
119 | net_conntrack_dialer_conn_established_total{dialer_name="prometheus"} 2
120 | net_conntrack_dialer_conn_established_total{dialer_name="random"} 9
121 | # HELP net_conntrack_dialer_conn_failed_total Total number of connections failed to dial by the dialer a given name.
122 | # TYPE net_conntrack_dialer_conn_failed_total counter
123 | net_conntrack_dialer_conn_failed_total{dialer_name="alertmanager",reason="refused"} 0
124 | net_conntrack_dialer_conn_failed_total{dialer_name="alertmanager",reason="resolution"} 0
125 | net_conntrack_dialer_conn_failed_total{dialer_name="alertmanager",reason="timeout"} 6
126 | net_conntrack_dialer_conn_failed_total{dialer_name="alertmanager",reason="unknown"} 6
127 | net_conntrack_dialer_conn_failed_total{dialer_name="blackbox",reason="refused"} 0
128 | net_conntrack_dialer_conn_failed_total{dialer_name="blackbox",reason="resolution"} 0
129 | net_conntrack_dialer_conn_failed_total{dialer_name="blackbox",reason="timeout"} 5
130 | net_conntrack_dialer_conn_failed_total{dialer_name="blackbox",reason="unknown"} 5
131 | net_conntrack_dialer_conn_failed_total{dialer_name="caddy",reason="refused"} 0
132 | net_conntrack_dialer_conn_failed_total{dialer_name="caddy",reason="resolution"} 0
133 | net_conntrack_dialer_conn_failed_total{dialer_name="caddy",reason="timeout"} 4
134 | net_conntrack_dialer_conn_failed_total{dialer_name="caddy",reason="unknown"} 4
135 | net_conntrack_dialer_conn_failed_total{dialer_name="default",reason="refused"} 0
136 | net_conntrack_dialer_conn_failed_total{dialer_name="default",reason="resolution"} 0
137 | net_conntrack_dialer_conn_failed_total{dialer_name="default",reason="timeout"} 0
138 | net_conntrack_dialer_conn_failed_total{dialer_name="default",reason="unknown"} 0
139 | net_conntrack_dialer_conn_failed_total{dialer_name="grafana",reason="refused"} 0
140 | net_conntrack_dialer_conn_failed_total{dialer_name="grafana",reason="resolution"} 0
141 | net_conntrack_dialer_conn_failed_total{dialer_name="grafana",reason="timeout"} 6
142 | net_conntrack_dialer_conn_failed_total{dialer_name="grafana",reason="unknown"} 6
143 | net_conntrack_dialer_conn_failed_total{dialer_name="node",reason="refused"} 0
144 | net_conntrack_dialer_conn_failed_total{dialer_name="node",reason="resolution"} 0
145 | net_conntrack_dialer_conn_failed_total{dialer_name="node",reason="timeout"} 5
146 | net_conntrack_dialer_conn_failed_total{dialer_name="node",reason="unknown"} 5
147 | net_conntrack_dialer_conn_failed_total{dialer_name="prometheus",reason="refused"} 0
148 | net_conntrack_dialer_conn_failed_total{dialer_name="prometheus",reason="resolution"} 0
149 | net_conntrack_dialer_conn_failed_total{dialer_name="prometheus",reason="timeout"} 5
150 | net_conntrack_dialer_conn_failed_total{dialer_name="prometheus",reason="unknown"} 5
151 | net_conntrack_dialer_conn_failed_total{dialer_name="random",reason="refused"} 0
152 | net_conntrack_dialer_conn_failed_total{dialer_name="random",reason="resolution"} 0
153 | net_conntrack_dialer_conn_failed_total{dialer_name="random",reason="timeout"} 18
154 | net_conntrack_dialer_conn_failed_total{dialer_name="random",reason="unknown"} 18
155 | # HELP net_conntrack_listener_conn_accepted_total Total number of connections opened to the listener of a given name.
156 | # TYPE net_conntrack_listener_conn_accepted_total counter
157 | net_conntrack_listener_conn_accepted_total{listener_name="http"} 88799
158 | # HELP net_conntrack_listener_conn_closed_total Total number of connections closed that were made to the listener of a given name.
159 | # TYPE net_conntrack_listener_conn_closed_total counter
160 | net_conntrack_listener_conn_closed_total{listener_name="http"} 88856
161 | # HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
162 | # TYPE process_cpu_seconds_total counter
163 | process_cpu_seconds_total 2494.68
164 | # HELP process_max_fds Maximum number of open file descriptors.
165 | # TYPE process_max_fds gauge
166 | process_max_fds 65000
167 | # HELP process_open_fds Number of open file descriptors.
168 | # TYPE process_open_fds gauge
169 | process_open_fds 98
170 | # HELP process_resident_memory_bytes Resident memory size in bytes.
171 | # TYPE process_resident_memory_bytes gauge
172 | process_resident_memory_bytes 1.96296704e+08
173 | # HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
174 | # TYPE process_start_time_seconds gauge
175 | process_start_time_seconds 1.65726368705e+09
176 | # HELP process_virtual_memory_bytes Virtual memory size in bytes.
177 | # TYPE process_virtual_memory_bytes gauge
178 | process_virtual_memory_bytes 3.324895232e+09
179 | # HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
180 | # TYPE process_virtual_memory_max_bytes gauge
181 | process_virtual_memory_max_bytes 1.8446744073709552e+19
182 | # HELP prometheus_api_remote_read_queries The current number of remote read queries being executed or waiting.
183 | # TYPE prometheus_api_remote_read_queries gauge
184 | prometheus_api_remote_read_queries 0
185 | # HELP prometheus_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which prometheus was built.
186 | # TYPE prometheus_build_info gauge
187 | prometheus_build_info{branch="HEAD",goversion="go1.16.4",revision="24c9b61221f7006e87cd62b9fe2901d43e19ed53",version="2.27.0"} 1
188 | # HELP prometheus_config_last_reload_success_timestamp_seconds Timestamp of the last successful configuration reload.
189 | # TYPE prometheus_config_last_reload_success_timestamp_seconds gauge
190 | prometheus_config_last_reload_success_timestamp_seconds 1.65726369185481e+09
191 | # HELP prometheus_config_last_reload_successful Whether the last configuration reload attempt was successful.
192 | # TYPE prometheus_config_last_reload_successful gauge
193 | prometheus_config_last_reload_successful 1
194 | # HELP prometheus_engine_queries The current number of queries being executed or waiting.
195 | # TYPE prometheus_engine_queries gauge
196 | prometheus_engine_queries 0
197 | # HELP prometheus_engine_queries_concurrent_max The max number of concurrent queries.
198 | # TYPE prometheus_engine_queries_concurrent_max gauge
199 | prometheus_engine_queries_concurrent_max 20
200 | # HELP prometheus_engine_query_duration_seconds Query timings
201 | # TYPE prometheus_engine_query_duration_seconds summary
202 | prometheus_engine_query_duration_seconds{slice="inner_eval",quantile="0.5"} 7.6755e-05
203 | prometheus_engine_query_duration_seconds{slice="inner_eval",quantile="0.9"} 0.001901623
204 | prometheus_engine_query_duration_seconds{slice="inner_eval",quantile="0.99"} 0.003642006
205 | prometheus_engine_query_duration_seconds_sum{slice="inner_eval"} 247.24440611399746
206 | prometheus_engine_query_duration_seconds_count{slice="inner_eval"} 527279
207 | prometheus_engine_query_duration_seconds{slice="prepare_time",quantile="0.5"} 9.1768e-05
208 | prometheus_engine_query_duration_seconds{slice="prepare_time",quantile="0.9"} 0.000267003
209 | prometheus_engine_query_duration_seconds{slice="prepare_time",quantile="0.99"} 0.000912644
210 | prometheus_engine_query_duration_seconds_sum{slice="prepare_time"} 7481.011107413205
211 | prometheus_engine_query_duration_seconds_count{slice="prepare_time"} 527304
212 | prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.5"} 1.0023e-05
213 | prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.9"} 3.1907e-05
214 | prometheus_engine_query_duration_seconds{slice="queue_time",quantile="0.99"} 7.3685e-05
215 | prometheus_engine_query_duration_seconds_sum{slice="queue_time"} 591.3979370410469
216 | prometheus_engine_query_duration_seconds_count{slice="queue_time"} 527377
217 | prometheus_engine_query_duration_seconds{slice="result_sort",quantile="0.5"} 1.085e-06
218 | prometheus_engine_query_duration_seconds{slice="result_sort",quantile="0.9"} 3.084e-06
219 | prometheus_engine_query_duration_seconds{slice="result_sort",quantile="0.99"} 2.2317e-05
220 | prometheus_engine_query_duration_seconds_sum{slice="result_sort"} 0.3910387529999967
221 | prometheus_engine_query_duration_seconds_count{slice="result_sort"} 178480
222 | # HELP prometheus_engine_query_log_enabled State of the query log.
223 | # TYPE prometheus_engine_query_log_enabled gauge
224 | prometheus_engine_query_log_enabled 0
225 | # HELP prometheus_engine_query_log_failures_total The number of query log failures.
226 | # TYPE prometheus_engine_query_log_failures_total counter
227 | prometheus_engine_query_log_failures_total 0
228 | # HELP prometheus_http_request_duration_seconds Histogram of latencies for HTTP requests.
229 | # TYPE prometheus_http_request_duration_seconds histogram
230 | prometheus_http_request_duration_seconds_bucket{handler="/",le="0.1"} 42
231 | prometheus_http_request_duration_seconds_bucket{handler="/",le="0.2"} 42
232 | prometheus_http_request_duration_seconds_bucket{handler="/",le="0.4"} 42
233 | prometheus_http_request_duration_seconds_bucket{handler="/",le="1"} 42
234 | prometheus_http_request_duration_seconds_bucket{handler="/",le="3"} 42
235 | prometheus_http_request_duration_seconds_bucket{handler="/",le="8"} 42
236 | prometheus_http_request_duration_seconds_bucket{handler="/",le="20"} 42
237 | prometheus_http_request_duration_seconds_bucket{handler="/",le="60"} 42
238 | prometheus_http_request_duration_seconds_bucket{handler="/",le="120"} 42
239 | prometheus_http_request_duration_seconds_bucket{handler="/",le="+Inf"} 42
240 | prometheus_http_request_duration_seconds_sum{handler="/"} 0.0020403240000000005
241 | prometheus_http_request_duration_seconds_count{handler="/"} 42
242 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="0.1"} 6852
243 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="0.2"} 6852
244 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="0.4"} 6852
245 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="1"} 6853
246 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="3"} 6853
247 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="8"} 6853
248 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="20"} 6853
249 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="60"} 6853
250 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="120"} 6853
251 | prometheus_http_request_duration_seconds_bucket{handler="/-/healthy",le="+Inf"} 6853
252 | prometheus_http_request_duration_seconds_sum{handler="/-/healthy"} 1.0717926090000012
253 | prometheus_http_request_duration_seconds_count{handler="/-/healthy"} 6853
254 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="0.1"} 7
255 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="0.2"} 7
256 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="0.4"} 7
257 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="1"} 7
258 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="3"} 7
259 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="8"} 7
260 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="20"} 7
261 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="60"} 7
262 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="120"} 7
263 | prometheus_http_request_duration_seconds_bucket{handler="/alerts",le="+Inf"} 7
264 | prometheus_http_request_duration_seconds_sum{handler="/alerts"} 0.0013533899999999999
265 | prometheus_http_request_duration_seconds_count{handler="/alerts"} 7
266 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="0.1"} 2
267 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="0.2"} 2
268 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="0.4"} 2
269 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="1"} 2
270 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="3"} 2
271 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="8"} 2
272 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="20"} 2
273 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="60"} 2
274 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="120"} 2
275 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alertmanagers",le="+Inf"} 2
276 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/alertmanagers"} 0.000927544
277 | prometheus_http_request_duration_seconds_count{handler="/api/v1/alertmanagers"} 2
278 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="0.1"} 1703
279 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="0.2"} 1704
280 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="0.4"} 1704
281 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="1"} 1704
282 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="3"} 1704
283 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="8"} 1704
284 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="20"} 1704
285 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="60"} 1705
286 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="120"} 1705
287 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/alerts",le="+Inf"} 1705
288 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/alerts"} 52.63526576099997
289 | prometheus_http_request_duration_seconds_count{handler="/api/v1/alerts"} 1705
290 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="0.1"} 800
291 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="0.2"} 800
292 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="0.4"} 800
293 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="1"} 800
294 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="3"} 800
295 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="8"} 800
296 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="20"} 800
297 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="60"} 800
298 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="120"} 800
299 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/label/:name/values",le="+Inf"} 800
300 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/label/:name/values"} 2.355083305999997
301 | prometheus_http_request_duration_seconds_count{handler="/api/v1/label/:name/values"} 800
302 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="0.1"} 342
303 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="0.2"} 342
304 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="0.4"} 342
305 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="1"} 342
306 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="3"} 342
307 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="8"} 342
308 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="20"} 342
309 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="60"} 342
310 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="120"} 342
311 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/labels",le="+Inf"} 342
312 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/labels"} 0.3745423250000002
313 | prometheus_http_request_duration_seconds_count{handler="/api/v1/labels"} 342
314 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="0.1"} 323
315 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="0.2"} 323
316 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="0.4"} 323
317 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="1"} 323
318 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="3"} 323
319 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="8"} 323
320 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="20"} 323
321 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="60"} 323
322 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="120"} 323
323 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/metadata",le="+Inf"} 323
324 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/metadata"} 2.606548670999997
325 | prometheus_http_request_duration_seconds_count{handler="/api/v1/metadata"} 323
326 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="0.1"} 12931
327 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="0.2"} 12942
328 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="0.4"} 12953
329 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="1"} 12962
330 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="3"} 12972
331 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="8"} 12972
332 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="20"} 12972
333 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="60"} 12972
334 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="120"} 12973
335 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query",le="+Inf"} 12975
336 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/query"} 1421.0503768750084
337 | prometheus_http_request_duration_seconds_count{handler="/api/v1/query"} 12975
338 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="0.1"} 237
339 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="0.2"} 237
340 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="0.4"} 237
341 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="1"} 237
342 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="3"} 237
343 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="8"} 237
344 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="20"} 237
345 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="60"} 237
346 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="120"} 237
347 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_exemplars",le="+Inf"} 237
348 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/query_exemplars"} 0.4328830910000004
349 | prometheus_http_request_duration_seconds_count{handler="/api/v1/query_exemplars"} 237
350 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="0.1"} 179798
351 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="0.2"} 179865
352 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="0.4"} 179883
353 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="1"} 179925
354 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="3"} 179949
355 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="8"} 179950
356 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="20"} 179950
357 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="60"} 179951
358 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="120"} 179953
359 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/query_range",le="+Inf"} 179974
360 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/query_range"} 9194.238809105795
361 | prometheus_http_request_duration_seconds_count{handler="/api/v1/query_range"} 179974
362 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="0.1"} 53552
363 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="0.2"} 53585
364 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="0.4"} 53589
365 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="1"} 53599
366 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="3"} 53626
367 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="8"} 53628
368 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="20"} 53630
369 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="60"} 53630
370 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="120"} 53631
371 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/rules",le="+Inf"} 53654
372 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/rules"} 27711.942830079057
373 | prometheus_http_request_duration_seconds_count{handler="/api/v1/rules"} 53654
374 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="0.1"} 1153
375 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="0.2"} 1153
376 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="0.4"} 1176
377 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="1"} 1179
378 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="3"} 1180
379 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="8"} 1183
380 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="20"} 1206
381 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="60"} 1207
382 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="120"} 1208
383 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/series",le="+Inf"} 1210
384 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/series"} 3939.6205528819987
385 | prometheus_http_request_duration_seconds_count{handler="/api/v1/series"} 1210
386 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="0.1"} 389
387 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="0.2"} 389
388 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="0.4"} 389
389 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="1"} 389
390 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="3"} 389
391 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="8"} 389
392 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="20"} 389
393 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="60"} 389
394 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="120"} 389
395 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/buildinfo",le="+Inf"} 389
396 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/status/buildinfo"} 0.2606329979999999
397 | prometheus_http_request_duration_seconds_count{handler="/api/v1/status/buildinfo"} 389
398 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="0.1"} 11
399 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="0.2"} 11
400 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="0.4"} 11
401 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="1"} 11
402 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="3"} 11
403 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="8"} 11
404 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="20"} 11
405 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="60"} 11
406 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="120"} 11
407 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/config",le="+Inf"} 11
408 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/status/config"} 0.027650692
409 | prometheus_http_request_duration_seconds_count{handler="/api/v1/status/config"} 11
410 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="0.1"} 4
411 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="0.2"} 4
412 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="0.4"} 4
413 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="1"} 4
414 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="3"} 4
415 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="8"} 4
416 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="20"} 4
417 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="60"} 4
418 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="120"} 4
419 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/flags",le="+Inf"} 4
420 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/status/flags"} 0.002749187
421 | prometheus_http_request_duration_seconds_count{handler="/api/v1/status/flags"} 4
422 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="0.1"} 84
423 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="0.2"} 84
424 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="0.4"} 84
425 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="1"} 84
426 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="3"} 84
427 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="8"} 84
428 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="20"} 84
429 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="60"} 84
430 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="120"} 84
431 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/runtimeinfo",le="+Inf"} 84
432 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/status/runtimeinfo"} 0.2885053619999998
433 | prometheus_http_request_duration_seconds_count{handler="/api/v1/status/runtimeinfo"} 84
434 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="0.1"} 2
435 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="0.2"} 2
436 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="0.4"} 2
437 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="1"} 2
438 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="3"} 2
439 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="8"} 2
440 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="20"} 2
441 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="60"} 2
442 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="120"} 2
443 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/status/tsdb",le="+Inf"} 2
444 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/status/tsdb"} 0.008651101000000001
445 | prometheus_http_request_duration_seconds_count{handler="/api/v1/status/tsdb"} 2
446 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="0.1"} 14
447 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="0.2"} 14
448 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="0.4"} 14
449 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="1"} 14
450 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="3"} 14
451 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="8"} 14
452 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="20"} 14
453 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="60"} 14
454 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="120"} 14
455 | prometheus_http_request_duration_seconds_bucket{handler="/api/v1/targets",le="+Inf"} 14
456 | prometheus_http_request_duration_seconds_sum{handler="/api/v1/targets"} 0.017452833999999997
457 | prometheus_http_request_duration_seconds_count{handler="/api/v1/targets"} 14
458 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="0.1"} 1
459 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="0.2"} 1
460 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="0.4"} 1
461 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="1"} 1
462 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="3"} 1
463 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="8"} 1
464 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="20"} 1
465 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="60"} 1
466 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="120"} 1
467 | prometheus_http_request_duration_seconds_bucket{handler="/classic/",le="+Inf"} 1
468 | prometheus_http_request_duration_seconds_sum{handler="/classic/"} 0.000128106
469 | prometheus_http_request_duration_seconds_count{handler="/classic/"} 1
470 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="0.1"} 19
471 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="0.2"} 19
472 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="0.4"} 19
473 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="1"} 19
474 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="3"} 19
475 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="8"} 19
476 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="20"} 19
477 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="60"} 19
478 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="120"} 19
479 | prometheus_http_request_duration_seconds_bucket{handler="/classic/graph",le="+Inf"} 19
480 | prometheus_http_request_duration_seconds_sum{handler="/classic/graph"} 0.04921511700000001
481 | prometheus_http_request_duration_seconds_count{handler="/classic/graph"} 19
482 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="0.1"} 130
483 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="0.2"} 130
484 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="0.4"} 133
485 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="1"} 133
486 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="3"} 133
487 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="8"} 133
488 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="20"} 133
489 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="60"} 133
490 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="120"} 133
491 | prometheus_http_request_duration_seconds_bucket{handler="/classic/static/*filepath",le="+Inf"} 133
492 | prometheus_http_request_duration_seconds_sum{handler="/classic/static/*filepath"} 1.1069649759999995
493 | prometheus_http_request_duration_seconds_count{handler="/classic/static/*filepath"} 133
494 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="0.1"} 1
495 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="0.2"} 1
496 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="0.4"} 1
497 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="1"} 1
498 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="3"} 1
499 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="8"} 1
500 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="20"} 1
501 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="60"} 1
502 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="120"} 1
503 | prometheus_http_request_duration_seconds_bucket{handler="/config",le="+Inf"} 1
504 | prometheus_http_request_duration_seconds_sum{handler="/config"} 0.000191963
505 | prometheus_http_request_duration_seconds_count{handler="/config"} 1
506 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="0.1"} 14
507 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="0.2"} 14
508 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="0.4"} 14
509 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="1"} 14
510 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="3"} 14
511 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="8"} 14
512 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="20"} 14
513 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="60"} 14
514 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="120"} 14
515 | prometheus_http_request_duration_seconds_bucket{handler="/consoles/*filepath",le="+Inf"} 14
516 | prometheus_http_request_duration_seconds_sum{handler="/consoles/*filepath"} 0.06552624800000001
517 | prometheus_http_request_duration_seconds_count{handler="/consoles/*filepath"} 14
518 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="0.1"} 41
519 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="0.2"} 41
520 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="0.4"} 41
521 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="1"} 41
522 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="3"} 41
523 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="8"} 41
524 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="20"} 41
525 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="60"} 41
526 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="120"} 41
527 | prometheus_http_request_duration_seconds_bucket{handler="/favicon.ico",le="+Inf"} 41
528 | prometheus_http_request_duration_seconds_sum{handler="/favicon.ico"} 0.037647288999999994
529 | prometheus_http_request_duration_seconds_count{handler="/favicon.ico"} 41
530 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="0.1"} 4
531 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="0.2"} 4
532 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="0.4"} 4
533 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="1"} 4
534 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="3"} 4
535 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="8"} 4
536 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="20"} 4
537 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="60"} 4
538 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="120"} 4
539 | prometheus_http_request_duration_seconds_bucket{handler="/flags",le="+Inf"} 4
540 | prometheus_http_request_duration_seconds_sum{handler="/flags"} 0.000994235
541 | prometheus_http_request_duration_seconds_count{handler="/flags"} 4
542 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="0.1"} 122
543 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="0.2"} 122
544 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="0.4"} 122
545 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="1"} 122
546 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="3"} 122
547 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="8"} 122
548 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="20"} 122
549 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="60"} 122
550 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="120"} 122
551 | prometheus_http_request_duration_seconds_bucket{handler="/graph",le="+Inf"} 122
552 | prometheus_http_request_duration_seconds_sum{handler="/graph"} 0.02918777199999999
553 | prometheus_http_request_duration_seconds_count{handler="/graph"} 122
554 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="0.1"} 16
555 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="0.2"} 16
556 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="0.4"} 16
557 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="1"} 16
558 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="3"} 16
559 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="8"} 16
560 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="20"} 16
561 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="60"} 16
562 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="120"} 16
563 | prometheus_http_request_duration_seconds_bucket{handler="/manifest.json",le="+Inf"} 16
564 | prometheus_http_request_duration_seconds_sum{handler="/manifest.json"} 0.002285126
565 | prometheus_http_request_duration_seconds_count{handler="/manifest.json"} 16
566 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.1"} 33618
567 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.2"} 33624
568 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.4"} 33627
569 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="1"} 33630
570 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="3"} 33648
571 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="8"} 33649
572 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="20"} 33650
573 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="60"} 33650
574 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="120"} 33650
575 | prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="+Inf"} 33660
576 | prometheus_http_request_duration_seconds_sum{handler="/metrics"} 12191.70056081419
577 | prometheus_http_request_duration_seconds_count{handler="/metrics"} 33660
578 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="0.1"} 5
579 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="0.2"} 5
580 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="0.4"} 5
581 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="1"} 5
582 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="3"} 5
583 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="8"} 5
584 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="20"} 5
585 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="60"} 5
586 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="120"} 5
587 | prometheus_http_request_duration_seconds_bucket{handler="/rules",le="+Inf"} 5
588 | prometheus_http_request_duration_seconds_sum{handler="/rules"} 0.00119607
589 | prometheus_http_request_duration_seconds_count{handler="/rules"} 5
590 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="0.1"} 6
591 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="0.2"} 6
592 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="0.4"} 6
593 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="1"} 6
594 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="3"} 6
595 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="8"} 6
596 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="20"} 6
597 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="60"} 6
598 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="120"} 6
599 | prometheus_http_request_duration_seconds_bucket{handler="/service-discovery",le="+Inf"} 6
600 | prometheus_http_request_duration_seconds_sum{handler="/service-discovery"} 0.001334735
601 | prometheus_http_request_duration_seconds_count{handler="/service-discovery"} 6
602 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="0.1"} 127
603 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="0.2"} 131
604 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="0.4"} 144
605 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="1"} 174
606 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="3"} 181
607 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="8"} 185
608 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="20"} 185
609 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="60"} 186
610 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="120"} 186
611 | prometheus_http_request_duration_seconds_bucket{handler="/static/*filepath",le="+Inf"} 186
612 | prometheus_http_request_duration_seconds_sum{handler="/static/*filepath"} 79.59645382200003
613 | prometheus_http_request_duration_seconds_count{handler="/static/*filepath"} 186
614 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="0.1"} 1
615 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="0.2"} 1
616 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="0.4"} 1
617 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="1"} 1
618 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="3"} 1
619 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="8"} 1
620 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="20"} 1
621 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="60"} 1
622 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="120"} 1
623 | prometheus_http_request_duration_seconds_bucket{handler="/status",le="+Inf"} 1
624 | prometheus_http_request_duration_seconds_sum{handler="/status"} 0.000221853
625 | prometheus_http_request_duration_seconds_count{handler="/status"} 1
626 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="0.1"} 4
627 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="0.2"} 4
628 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="0.4"} 4
629 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="1"} 4
630 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="3"} 4
631 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="8"} 4
632 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="20"} 4
633 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="60"} 4
634 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="120"} 4
635 | prometheus_http_request_duration_seconds_bucket{handler="/targets",le="+Inf"} 4
636 | prometheus_http_request_duration_seconds_sum{handler="/targets"} 0.000832623
637 | prometheus_http_request_duration_seconds_count{handler="/targets"} 4
638 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="0.1"} 2
639 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="0.2"} 2
640 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="0.4"} 2
641 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="1"} 2
642 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="3"} 2
643 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="8"} 2
644 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="20"} 2
645 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="60"} 2
646 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="120"} 2
647 | prometheus_http_request_duration_seconds_bucket{handler="/tsdb-status",le="+Inf"} 2
648 | prometheus_http_request_duration_seconds_sum{handler="/tsdb-status"} 0.00037907
649 | prometheus_http_request_duration_seconds_count{handler="/tsdb-status"} 2
650 | # HELP prometheus_http_requests_total Counter of HTTP requests.
651 | # TYPE prometheus_http_requests_total counter
652 | prometheus_http_requests_total{code="200",handler="/-/healthy"} 6853
653 | prometheus_http_requests_total{code="200",handler="/alerts"} 7
654 | prometheus_http_requests_total{code="200",handler="/api/v1/alertmanagers"} 2
655 | prometheus_http_requests_total{code="200",handler="/api/v1/alerts"} 1705
656 | prometheus_http_requests_total{code="200",handler="/api/v1/label/:name/values"} 800
657 | prometheus_http_requests_total{code="200",handler="/api/v1/labels"} 342
658 | prometheus_http_requests_total{code="200",handler="/api/v1/metadata"} 323
659 | prometheus_http_requests_total{code="200",handler="/api/v1/query"} 12950
660 | prometheus_http_requests_total{code="200",handler="/api/v1/query_exemplars"} 237
661 | prometheus_http_requests_total{code="200",handler="/api/v1/query_range"} 178480
662 | prometheus_http_requests_total{code="200",handler="/api/v1/rules"} 53650
663 | prometheus_http_requests_total{code="200",handler="/api/v1/series"} 1196
664 | prometheus_http_requests_total{code="200",handler="/api/v1/status/buildinfo"} 389
665 | prometheus_http_requests_total{code="200",handler="/api/v1/status/config"} 11
666 | prometheus_http_requests_total{code="200",handler="/api/v1/status/flags"} 4
667 | prometheus_http_requests_total{code="200",handler="/api/v1/status/runtimeinfo"} 84
668 | prometheus_http_requests_total{code="200",handler="/api/v1/status/tsdb"} 2
669 | prometheus_http_requests_total{code="200",handler="/api/v1/targets"} 14
670 | prometheus_http_requests_total{code="200",handler="/classic/graph"} 19
671 | prometheus_http_requests_total{code="200",handler="/classic/static/*filepath"} 133
672 | prometheus_http_requests_total{code="200",handler="/config"} 1
673 | prometheus_http_requests_total{code="200",handler="/consoles/*filepath"} 9
674 | prometheus_http_requests_total{code="200",handler="/favicon.ico"} 41
675 | prometheus_http_requests_total{code="200",handler="/flags"} 4
676 | prometheus_http_requests_total{code="200",handler="/graph"} 122
677 | prometheus_http_requests_total{code="200",handler="/manifest.json"} 16
678 | prometheus_http_requests_total{code="200",handler="/metrics"} 33660
679 | prometheus_http_requests_total{code="200",handler="/rules"} 5
680 | prometheus_http_requests_total{code="200",handler="/service-discovery"} 6
681 | prometheus_http_requests_total{code="200",handler="/static/*filepath"} 186
682 | prometheus_http_requests_total{code="200",handler="/status"} 1
683 | prometheus_http_requests_total{code="200",handler="/targets"} 4
684 | prometheus_http_requests_total{code="200",handler="/tsdb-status"} 2
685 | prometheus_http_requests_total{code="302",handler="/"} 42
686 | prometheus_http_requests_total{code="302",handler="/classic/"} 1
687 | prometheus_http_requests_total{code="400",handler="/api/v1/query"} 14
688 | prometheus_http_requests_total{code="400",handler="/api/v1/query_range"} 1378
689 | prometheus_http_requests_total{code="400",handler="/api/v1/series"} 14
690 | prometheus_http_requests_total{code="404",handler="/consoles/*filepath"} 5
691 | prometheus_http_requests_total{code="422",handler="/api/v1/query"} 1
692 | prometheus_http_requests_total{code="503",handler="/api/v1/query"} 10
693 | prometheus_http_requests_total{code="503",handler="/api/v1/query_range"} 116
694 | prometheus_http_requests_total{code="503",handler="/api/v1/rules"} 4
695 | # HELP prometheus_http_response_size_bytes Histogram of response size for HTTP requests.
696 | # TYPE prometheus_http_response_size_bytes histogram
697 | prometheus_http_response_size_bytes_bucket{handler="/",le="100"} 42
698 | prometheus_http_response_size_bytes_bucket{handler="/",le="1000"} 42
699 | prometheus_http_response_size_bytes_bucket{handler="/",le="10000"} 42
700 | prometheus_http_response_size_bytes_bucket{handler="/",le="100000"} 42
701 | prometheus_http_response_size_bytes_bucket{handler="/",le="1e+06"} 42
702 | prometheus_http_response_size_bytes_bucket{handler="/",le="1e+07"} 42
703 | prometheus_http_response_size_bytes_bucket{handler="/",le="1e+08"} 42
704 | prometheus_http_response_size_bytes_bucket{handler="/",le="1e+09"} 42
705 | prometheus_http_response_size_bytes_bucket{handler="/",le="+Inf"} 42
706 | prometheus_http_response_size_bytes_sum{handler="/"} 1218
707 | prometheus_http_response_size_bytes_count{handler="/"} 42
708 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="100"} 6853
709 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="1000"} 6853
710 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="10000"} 6853
711 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="100000"} 6853
712 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="1e+06"} 6853
713 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="1e+07"} 6853
714 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="1e+08"} 6853
715 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="1e+09"} 6853
716 | prometheus_http_response_size_bytes_bucket{handler="/-/healthy",le="+Inf"} 6853
717 | prometheus_http_response_size_bytes_sum{handler="/-/healthy"} 157619
718 | prometheus_http_response_size_bytes_count{handler="/-/healthy"} 6853
719 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="100"} 0
720 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="1000"} 0
721 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="10000"} 7
722 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="100000"} 7
723 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="1e+06"} 7
724 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="1e+07"} 7
725 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="1e+08"} 7
726 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="1e+09"} 7
727 | prometheus_http_response_size_bytes_bucket{handler="/alerts",le="+Inf"} 7
728 | prometheus_http_response_size_bytes_sum{handler="/alerts"} 16247
729 | prometheus_http_response_size_bytes_count{handler="/alerts"} 7
730 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="100"} 0
731 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="1000"} 2
732 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="10000"} 2
733 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="100000"} 2
734 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="1e+06"} 2
735 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="1e+07"} 2
736 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="1e+08"} 2
737 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="1e+09"} 2
738 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alertmanagers",le="+Inf"} 2
739 | prometheus_http_response_size_bytes_sum{handler="/api/v1/alertmanagers"} 270
740 | prometheus_http_response_size_bytes_count{handler="/api/v1/alertmanagers"} 2
741 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="100"} 0
742 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="1000"} 1705
743 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="10000"} 1705
744 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="100000"} 1705
745 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="1e+06"} 1705
746 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="1e+07"} 1705
747 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="1e+08"} 1705
748 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="1e+09"} 1705
749 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/alerts",le="+Inf"} 1705
750 | prometheus_http_response_size_bytes_sum{handler="/api/v1/alerts"} 662635
751 | prometheus_http_response_size_bytes_count{handler="/api/v1/alerts"} 1705
752 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="100"} 17
753 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="1000"} 188
754 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="10000"} 798
755 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="100000"} 800
756 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="1e+06"} 800
757 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="1e+07"} 800
758 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="1e+08"} 800
759 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="1e+09"} 800
760 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="+Inf"} 800
761 | prometheus_http_response_size_bytes_sum{handler="/api/v1/label/:name/values"} 2.889406e+06
762 | prometheus_http_response_size_bytes_count{handler="/api/v1/label/:name/values"} 800
763 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="100"} 0
764 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="1000"} 342
765 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="10000"} 342
766 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="100000"} 342
767 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="1e+06"} 342
768 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="1e+07"} 342
769 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="1e+08"} 342
770 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="1e+09"} 342
771 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/labels",le="+Inf"} 342
772 | prometheus_http_response_size_bytes_sum{handler="/api/v1/labels"} 129618
773 | prometheus_http_response_size_bytes_count{handler="/api/v1/labels"} 342
774 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="100"} 0
775 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="1000"} 0
776 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="10000"} 1
777 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="100000"} 323
778 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="1e+06"} 323
779 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="1e+07"} 323
780 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="1e+08"} 323
781 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="1e+09"} 323
782 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/metadata",le="+Inf"} 323
783 | prometheus_http_response_size_bytes_sum{handler="/api/v1/metadata"} 3.506991e+06
784 | prometheus_http_response_size_bytes_count{handler="/api/v1/metadata"} 323
785 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="100"} 11001
786 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="1000"} 12771
787 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="10000"} 12941
788 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="100000"} 12942
789 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="1e+06"} 12975
790 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="1e+07"} 12975
791 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="1e+08"} 12975
792 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="1e+09"} 12975
793 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query",le="+Inf"} 12975
794 | prometheus_http_response_size_bytes_sum{handler="/api/v1/query"} 1.6393801e+07
795 | prometheus_http_response_size_bytes_count{handler="/api/v1/query"} 12975
796 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="100"} 237
797 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="1000"} 237
798 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="10000"} 237
799 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="100000"} 237
800 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="1e+06"} 237
801 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="1e+07"} 237
802 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="1e+08"} 237
803 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="1e+09"} 237
804 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_exemplars",le="+Inf"} 237
805 | prometheus_http_response_size_bytes_sum{handler="/api/v1/query_exemplars"} 14457
806 | prometheus_http_response_size_bytes_count{handler="/api/v1/query_exemplars"} 237
807 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="100"} 3191
808 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="1000"} 133261
809 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="10000"} 179705
810 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="100000"} 179929
811 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="1e+06"} 179934
812 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="1e+07"} 179974
813 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="1e+08"} 179974
814 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="1e+09"} 179974
815 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/query_range",le="+Inf"} 179974
816 | prometheus_http_response_size_bytes_sum{handler="/api/v1/query_range"} 2.97238013e+08
817 | prometheus_http_response_size_bytes_count{handler="/api/v1/query_range"} 179974
818 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="100"} 4
819 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="1000"} 4
820 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="10000"} 53654
821 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="100000"} 53654
822 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="1e+06"} 53654
823 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="1e+07"} 53654
824 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="1e+08"} 53654
825 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="1e+09"} 53654
826 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/rules",le="+Inf"} 53654
827 | prometheus_http_response_size_bytes_sum{handler="/api/v1/rules"} 2.52985474e+08
828 | prometheus_http_response_size_bytes_count{handler="/api/v1/rules"} 53654
829 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="100"} 280
830 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="1000"} 1151
831 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="10000"} 1155
832 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="100000"} 1210
833 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="1e+06"} 1210
834 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="1e+07"} 1210
835 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="1e+08"} 1210
836 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="1e+09"} 1210
837 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/series",le="+Inf"} 1210
838 | prometheus_http_response_size_bytes_sum{handler="/api/v1/series"} 3.3142e+06
839 | prometheus_http_response_size_bytes_count{handler="/api/v1/series"} 1210
840 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="100"} 0
841 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="1000"} 389
842 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="10000"} 389
843 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="100000"} 389
844 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="1e+06"} 389
845 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="1e+07"} 389
846 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="1e+08"} 389
847 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="1e+09"} 389
848 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/buildinfo",le="+Inf"} 389
849 | prometheus_http_response_size_bytes_sum{handler="/api/v1/status/buildinfo"} 72743
850 | prometheus_http_response_size_bytes_count{handler="/api/v1/status/buildinfo"} 389
851 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="100"} 0
852 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="1000"} 11
853 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="10000"} 11
854 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="100000"} 11
855 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="1e+06"} 11
856 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="1e+07"} 11
857 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="1e+08"} 11
858 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="1e+09"} 11
859 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/config",le="+Inf"} 11
860 | prometheus_http_response_size_bytes_sum{handler="/api/v1/status/config"} 6512
861 | prometheus_http_response_size_bytes_count{handler="/api/v1/status/config"} 11
862 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="100"} 0
863 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="1000"} 4
864 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="10000"} 4
865 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="100000"} 4
866 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="1e+06"} 4
867 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="1e+07"} 4
868 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="1e+08"} 4
869 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="1e+09"} 4
870 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/flags",le="+Inf"} 4
871 | prometheus_http_response_size_bytes_sum{handler="/api/v1/status/flags"} 2872
872 | prometheus_http_response_size_bytes_count{handler="/api/v1/status/flags"} 4
873 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="100"} 0
874 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="1000"} 84
875 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="10000"} 84
876 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="100000"} 84
877 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="1e+06"} 84
878 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="1e+07"} 84
879 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="1e+08"} 84
880 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="1e+09"} 84
881 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/runtimeinfo",le="+Inf"} 84
882 | prometheus_http_response_size_bytes_sum{handler="/api/v1/status/runtimeinfo"} 21173
883 | prometheus_http_response_size_bytes_count{handler="/api/v1/status/runtimeinfo"} 84
884 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="100"} 0
885 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="1000"} 2
886 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="10000"} 2
887 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="100000"} 2
888 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="1e+06"} 2
889 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="1e+07"} 2
890 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="1e+08"} 2
891 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="1e+09"} 2
892 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/status/tsdb",le="+Inf"} 2
893 | prometheus_http_response_size_bytes_sum{handler="/api/v1/status/tsdb"} 1203
894 | prometheus_http_response_size_bytes_count{handler="/api/v1/status/tsdb"} 2
895 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="100"} 0
896 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="1000"} 14
897 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="10000"} 14
898 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="100000"} 14
899 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="1e+06"} 14
900 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="1e+07"} 14
901 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="1e+08"} 14
902 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="1e+09"} 14
903 | prometheus_http_response_size_bytes_bucket{handler="/api/v1/targets",le="+Inf"} 14
904 | prometheus_http_response_size_bytes_sum{handler="/api/v1/targets"} 11569
905 | prometheus_http_response_size_bytes_count{handler="/api/v1/targets"} 14
906 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="100"} 1
907 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="1000"} 1
908 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="10000"} 1
909 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="100000"} 1
910 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="1e+06"} 1
911 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="1e+07"} 1
912 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="1e+08"} 1
913 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="1e+09"} 1
914 | prometheus_http_response_size_bytes_bucket{handler="/classic/",le="+Inf"} 1
915 | prometheus_http_response_size_bytes_sum{handler="/classic/"} 37
916 | prometheus_http_response_size_bytes_count{handler="/classic/"} 1
917 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="100"} 0
918 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="1000"} 0
919 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="10000"} 19
920 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="100000"} 19
921 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="1e+06"} 19
922 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="1e+07"} 19
923 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="1e+08"} 19
924 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="1e+09"} 19
925 | prometheus_http_response_size_bytes_bucket{handler="/classic/graph",le="+Inf"} 19
926 | prometheus_http_response_size_bytes_sum{handler="/classic/graph"} 119529
927 | prometheus_http_response_size_bytes_count{handler="/classic/graph"} 19
928 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="100"} 0
929 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="1000"} 7
930 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="10000"} 47
931 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="100000"} 116
932 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="1e+06"} 133
933 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="1e+07"} 133
934 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="1e+08"} 133
935 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="1e+09"} 133
936 | prometheus_http_response_size_bytes_bucket{handler="/classic/static/*filepath",le="+Inf"} 133
937 | prometheus_http_response_size_bytes_sum{handler="/classic/static/*filepath"} 5.733851e+06
938 | prometheus_http_response_size_bytes_count{handler="/classic/static/*filepath"} 133
939 | prometheus_http_response_size_bytes_bucket{handler="/config",le="100"} 0
940 | prometheus_http_response_size_bytes_bucket{handler="/config",le="1000"} 0
941 | prometheus_http_response_size_bytes_bucket{handler="/config",le="10000"} 1
942 | prometheus_http_response_size_bytes_bucket{handler="/config",le="100000"} 1
943 | prometheus_http_response_size_bytes_bucket{handler="/config",le="1e+06"} 1
944 | prometheus_http_response_size_bytes_bucket{handler="/config",le="1e+07"} 1
945 | prometheus_http_response_size_bytes_bucket{handler="/config",le="1e+08"} 1
946 | prometheus_http_response_size_bytes_bucket{handler="/config",le="1e+09"} 1
947 | prometheus_http_response_size_bytes_bucket{handler="/config",le="+Inf"} 1
948 | prometheus_http_response_size_bytes_sum{handler="/config"} 2321
949 | prometheus_http_response_size_bytes_count{handler="/config"} 1
950 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="100"} 5
951 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="1000"} 5
952 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="10000"} 14
953 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="100000"} 14
954 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="1e+06"} 14
955 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="1e+07"} 14
956 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="1e+08"} 14
957 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="1e+09"} 14
958 | prometheus_http_response_size_bytes_bucket{handler="/consoles/*filepath",le="+Inf"} 14
959 | prometheus_http_response_size_bytes_sum{handler="/consoles/*filepath"} 55467
960 | prometheus_http_response_size_bytes_count{handler="/consoles/*filepath"} 14
961 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="100"} 0
962 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="1000"} 0
963 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="10000"} 0
964 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="100000"} 41
965 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="1e+06"} 41
966 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="1e+07"} 41
967 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="1e+08"} 41
968 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="1e+09"} 41
969 | prometheus_http_response_size_bytes_bucket{handler="/favicon.ico",le="+Inf"} 41
970 | prometheus_http_response_size_bytes_sum{handler="/favicon.ico"} 618526
971 | prometheus_http_response_size_bytes_count{handler="/favicon.ico"} 41
972 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="100"} 0
973 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="1000"} 0
974 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="10000"} 4
975 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="100000"} 4
976 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="1e+06"} 4
977 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="1e+07"} 4
978 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="1e+08"} 4
979 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="1e+09"} 4
980 | prometheus_http_response_size_bytes_bucket{handler="/flags",le="+Inf"} 4
981 | prometheus_http_response_size_bytes_sum{handler="/flags"} 9284
982 | prometheus_http_response_size_bytes_count{handler="/flags"} 4
983 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="100"} 0
984 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="1000"} 0
985 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="10000"} 122
986 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="100000"} 122
987 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="1e+06"} 122
988 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="1e+07"} 122
989 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="1e+08"} 122
990 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="1e+09"} 122
991 | prometheus_http_response_size_bytes_bucket{handler="/graph",le="+Inf"} 122
992 | prometheus_http_response_size_bytes_sum{handler="/graph"} 283162
993 | prometheus_http_response_size_bytes_count{handler="/graph"} 122
994 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="100"} 0
995 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="1000"} 16
996 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="10000"} 16
997 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="100000"} 16
998 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="1e+06"} 16
999 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="1e+07"} 16
1000 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="1e+08"} 16
1001 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="1e+09"} 16
1002 | prometheus_http_response_size_bytes_bucket{handler="/manifest.json",le="+Inf"} 16
1003 | prometheus_http_response_size_bytes_sum{handler="/manifest.json"} 5088
1004 | prometheus_http_response_size_bytes_count{handler="/manifest.json"} 16
1005 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="100"} 0
1006 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="1000"} 0
1007 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="10000"} 254
1008 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="100000"} 33660
1009 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="1e+06"} 33660
1010 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="1e+07"} 33660
1011 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="1e+08"} 33660
1012 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="1e+09"} 33660
1013 | prometheus_http_response_size_bytes_bucket{handler="/metrics",le="+Inf"} 33660
1014 | prometheus_http_response_size_bytes_sum{handler="/metrics"} 4.18487653e+08
1015 | prometheus_http_response_size_bytes_count{handler="/metrics"} 33660
1016 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="100"} 0
1017 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="1000"} 0
1018 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="10000"} 5
1019 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="100000"} 5
1020 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="1e+06"} 5
1021 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="1e+07"} 5
1022 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="1e+08"} 5
1023 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="1e+09"} 5
1024 | prometheus_http_response_size_bytes_bucket{handler="/rules",le="+Inf"} 5
1025 | prometheus_http_response_size_bytes_sum{handler="/rules"} 11605
1026 | prometheus_http_response_size_bytes_count{handler="/rules"} 5
1027 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="100"} 0
1028 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="1000"} 0
1029 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="10000"} 6
1030 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="100000"} 6
1031 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="1e+06"} 6
1032 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="1e+07"} 6
1033 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="1e+08"} 6
1034 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="1e+09"} 6
1035 | prometheus_http_response_size_bytes_bucket{handler="/service-discovery",le="+Inf"} 6
1036 | prometheus_http_response_size_bytes_sum{handler="/service-discovery"} 13926
1037 | prometheus_http_response_size_bytes_count{handler="/service-discovery"} 6
1038 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="100"} 0
1039 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="1000"} 0
1040 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="10000"} 0
1041 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="100000"} 45
1042 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="1e+06"} 138
1043 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="1e+07"} 186
1044 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="1e+08"} 186
1045 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="1e+09"} 186
1046 | prometheus_http_response_size_bytes_bucket{handler="/static/*filepath",le="+Inf"} 186
1047 | prometheus_http_response_size_bytes_sum{handler="/static/*filepath"} 1.04106702e+08
1048 | prometheus_http_response_size_bytes_count{handler="/static/*filepath"} 186
1049 | prometheus_http_response_size_bytes_bucket{handler="/status",le="100"} 0
1050 | prometheus_http_response_size_bytes_bucket{handler="/status",le="1000"} 0
1051 | prometheus_http_response_size_bytes_bucket{handler="/status",le="10000"} 1
1052 | prometheus_http_response_size_bytes_bucket{handler="/status",le="100000"} 1
1053 | prometheus_http_response_size_bytes_bucket{handler="/status",le="1e+06"} 1
1054 | prometheus_http_response_size_bytes_bucket{handler="/status",le="1e+07"} 1
1055 | prometheus_http_response_size_bytes_bucket{handler="/status",le="1e+08"} 1
1056 | prometheus_http_response_size_bytes_bucket{handler="/status",le="1e+09"} 1
1057 | prometheus_http_response_size_bytes_bucket{handler="/status",le="+Inf"} 1
1058 | prometheus_http_response_size_bytes_sum{handler="/status"} 2321
1059 | prometheus_http_response_size_bytes_count{handler="/status"} 1
1060 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="100"} 0
1061 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="1000"} 0
1062 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="10000"} 4
1063 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="100000"} 4
1064 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="1e+06"} 4
1065 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="1e+07"} 4
1066 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="1e+08"} 4
1067 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="1e+09"} 4
1068 | prometheus_http_response_size_bytes_bucket{handler="/targets",le="+Inf"} 4
1069 | prometheus_http_response_size_bytes_sum{handler="/targets"} 9284
1070 | prometheus_http_response_size_bytes_count{handler="/targets"} 4
1071 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="100"} 0
1072 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="1000"} 0
1073 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="10000"} 2
1074 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="100000"} 2
1075 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="1e+06"} 2
1076 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="1e+07"} 2
1077 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="1e+08"} 2
1078 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="1e+09"} 2
1079 | prometheus_http_response_size_bytes_bucket{handler="/tsdb-status",le="+Inf"} 2
1080 | prometheus_http_response_size_bytes_sum{handler="/tsdb-status"} 4642
1081 | prometheus_http_response_size_bytes_count{handler="/tsdb-status"} 2
1082 | # HELP prometheus_notifications_alertmanagers_discovered The number of alertmanagers discovered and active.
1083 | # TYPE prometheus_notifications_alertmanagers_discovered gauge
1084 | prometheus_notifications_alertmanagers_discovered 1
1085 | # HELP prometheus_notifications_dropped_total Total number of alerts dropped due to errors when sending to Alertmanager.
1086 | # TYPE prometheus_notifications_dropped_total counter
1087 | prometheus_notifications_dropped_total 0
1088 | # HELP prometheus_notifications_errors_total Total number of errors sending alert notifications.
1089 | # TYPE prometheus_notifications_errors_total counter
1090 | prometheus_notifications_errors_total{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts"} 0
1091 | # HELP prometheus_notifications_latency_seconds Latency quantiles for sending alert notifications.
1092 | # TYPE prometheus_notifications_latency_seconds summary
1093 | prometheus_notifications_latency_seconds{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts",quantile="0.5"} 0.004028132
1094 | prometheus_notifications_latency_seconds{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts",quantile="0.9"} 0.007527837
1095 | prometheus_notifications_latency_seconds{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts",quantile="0.99"} 0.007527837
1096 | prometheus_notifications_latency_seconds_sum{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts"} 8.724933488000008
1097 | prometheus_notifications_latency_seconds_count{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts"} 1371
1098 | # HELP prometheus_notifications_queue_capacity The capacity of the alert notifications queue.
1099 | # TYPE prometheus_notifications_queue_capacity gauge
1100 | prometheus_notifications_queue_capacity 10000
1101 | # HELP prometheus_notifications_queue_length The number of alert notifications in the queue.
1102 | # TYPE prometheus_notifications_queue_length gauge
1103 | prometheus_notifications_queue_length 0
1104 | # HELP prometheus_notifications_sent_total Total number of alerts sent.
1105 | # TYPE prometheus_notifications_sent_total counter
1106 | prometheus_notifications_sent_total{alertmanager="http://demo.do.prometheus.io:9093/api/v2/alerts"} 1371
1107 | # HELP prometheus_remote_storage_exemplars_in_total Exemplars in to remote storage, compare to exemplars out for queue managers.
1108 | # TYPE prometheus_remote_storage_exemplars_in_total counter
1109 | prometheus_remote_storage_exemplars_in_total 575652
1110 | # HELP prometheus_remote_storage_highest_timestamp_in_seconds Highest timestamp that has come into the remote storage via the Appender interface, in seconds since epoch.
1111 | # TYPE prometheus_remote_storage_highest_timestamp_in_seconds gauge
1112 | prometheus_remote_storage_highest_timestamp_in_seconds 1.657368229e+09
1113 | # HELP prometheus_remote_storage_samples_in_total Samples in to remote storage, compare to samples out for queue managers.
1114 | # TYPE prometheus_remote_storage_samples_in_total counter
1115 | prometheus_remote_storage_samples_in_total 8.4116578e+07
1116 | # HELP prometheus_remote_storage_string_interner_zero_reference_releases_total The number of times release has been called for strings that are not interned.
1117 | # TYPE prometheus_remote_storage_string_interner_zero_reference_releases_total counter
1118 | prometheus_remote_storage_string_interner_zero_reference_releases_total 0
1119 | # HELP prometheus_rule_evaluation_duration_seconds The duration for a rule to execute.
1120 | # TYPE prometheus_rule_evaluation_duration_seconds summary
1121 | prometheus_rule_evaluation_duration_seconds{quantile="0.5"} 0.000301979
1122 | prometheus_rule_evaluation_duration_seconds{quantile="0.9"} 0.001377458
1123 | prometheus_rule_evaluation_duration_seconds{quantile="0.99"} 0.0034303
1124 | prometheus_rule_evaluation_duration_seconds_sum 7222.409840753783
1125 | prometheus_rule_evaluation_duration_seconds_count 335797
1126 | # HELP prometheus_rule_evaluation_failures_total The total number of rule evaluation failures.
1127 | # TYPE prometheus_rule_evaluation_failures_total counter
1128 | prometheus_rule_evaluation_failures_total{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 1
1129 | prometheus_rule_evaluation_failures_total{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 1
1130 | prometheus_rule_evaluation_failures_total{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 2
1131 | prometheus_rule_evaluation_failures_total{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 2
1132 | # HELP prometheus_rule_evaluations_total The total number of rule evaluations.
1133 | # TYPE prometheus_rule_evaluations_total counter
1134 | prometheus_rule_evaluations_total{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 13706
1135 | prometheus_rule_evaluations_total{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 123354
1136 | prometheus_rule_evaluations_total{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 75383
1137 | prometheus_rule_evaluations_total{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 123354
1138 | # HELP prometheus_rule_group_duration_seconds The duration of rule group evaluations.
1139 | # TYPE prometheus_rule_group_duration_seconds summary
1140 | prometheus_rule_group_duration_seconds{quantile="0.01"} 0.000601961
1141 | prometheus_rule_group_duration_seconds{quantile="0.05"} 0.00063766
1142 | prometheus_rule_group_duration_seconds{quantile="0.5"} 0.004638181
1143 | prometheus_rule_group_duration_seconds{quantile="0.9"} 0.016064903
1144 | prometheus_rule_group_duration_seconds{quantile="0.99"} 0.031209702
1145 | prometheus_rule_group_duration_seconds_sum 7259.601873060052
1146 | prometheus_rule_group_duration_seconds_count 27412
1147 | # HELP prometheus_rule_group_interval_seconds The interval of a rule group.
1148 | # TYPE prometheus_rule_group_interval_seconds gauge
1149 | prometheus_rule_group_interval_seconds{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 15
1150 | prometheus_rule_group_interval_seconds{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 15
1151 | prometheus_rule_group_interval_seconds{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 15
1152 | prometheus_rule_group_interval_seconds{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 15
1153 | # HELP prometheus_rule_group_iterations_missed_total The total number of rule group evaluations missed due to slow rule group evaluation.
1154 | # TYPE prometheus_rule_group_iterations_missed_total counter
1155 | prometheus_rule_group_iterations_missed_total{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 116
1156 | prometheus_rule_group_iterations_missed_total{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 116
1157 | prometheus_rule_group_iterations_missed_total{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 116
1158 | prometheus_rule_group_iterations_missed_total{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 116
1159 | # HELP prometheus_rule_group_iterations_total The total number of scheduled rule group evaluations, whether executed or missed.
1160 | # TYPE prometheus_rule_group_iterations_total counter
1161 | prometheus_rule_group_iterations_total{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 6969
1162 | prometheus_rule_group_iterations_total{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 6969
1163 | prometheus_rule_group_iterations_total{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 6969
1164 | prometheus_rule_group_iterations_total{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 6969
1165 | # HELP prometheus_rule_group_last_duration_seconds The duration of the last rule group evaluation.
1166 | # TYPE prometheus_rule_group_last_duration_seconds gauge
1167 | prometheus_rule_group_last_duration_seconds{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 0.000735103
1168 | prometheus_rule_group_last_duration_seconds{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 0.014991464
1169 | prometheus_rule_group_last_duration_seconds{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 0.002876189
1170 | prometheus_rule_group_last_duration_seconds{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 0.006123991
1171 | # HELP prometheus_rule_group_last_evaluation_samples The number of samples returned during the last rule group evaluation.
1172 | # TYPE prometheus_rule_group_last_evaluation_samples gauge
1173 | prometheus_rule_group_last_evaluation_samples{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 2
1174 | prometheus_rule_group_last_evaluation_samples{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 0
1175 | prometheus_rule_group_last_evaluation_samples{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 11
1176 | prometheus_rule_group_last_evaluation_samples{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 0
1177 | # HELP prometheus_rule_group_last_evaluation_timestamp_seconds The timestamp of the last rule group evaluation in seconds.
1178 | # TYPE prometheus_rule_group_last_evaluation_timestamp_seconds gauge
1179 | prometheus_rule_group_last_evaluation_timestamp_seconds{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 1.6573682243193521e+09
1180 | prometheus_rule_group_last_evaluation_timestamp_seconds{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 1.6573682243078804e+09
1181 | prometheus_rule_group_last_evaluation_timestamp_seconds{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 1.6573682261256976e+09
1182 | prometheus_rule_group_last_evaluation_timestamp_seconds{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 1.6573682231563098e+09
1183 | # HELP prometheus_rule_group_rules The number of rules.
1184 | # TYPE prometheus_rule_group_rules gauge
1185 | prometheus_rule_group_rules{rule_group="/etc/prometheus/rules/ansible_managed.rules;ansible managed alert rules"} 2
1186 | prometheus_rule_group_rules{rule_group="/etc/prometheus/rules/node_alerts.rules;node-exporter"} 18
1187 | prometheus_rule_group_rules{rule_group="/etc/prometheus/rules/node_rules.rules;node-exporter.rules"} 11
1188 | prometheus_rule_group_rules{rule_group="/etc/prometheus/rules/prometheus_alerts.rules;prometheus"} 18
1189 | # HELP prometheus_sd_consul_rpc_duration_seconds The duration of a Consul RPC call in seconds.
1190 | # TYPE prometheus_sd_consul_rpc_duration_seconds summary
1191 | prometheus_sd_consul_rpc_duration_seconds{call="service",endpoint="catalog",quantile="0.5"} NaN
1192 | prometheus_sd_consul_rpc_duration_seconds{call="service",endpoint="catalog",quantile="0.9"} NaN
1193 | prometheus_sd_consul_rpc_duration_seconds{call="service",endpoint="catalog",quantile="0.99"} NaN
1194 | prometheus_sd_consul_rpc_duration_seconds_sum{call="service",endpoint="catalog"} 0
1195 | prometheus_sd_consul_rpc_duration_seconds_count{call="service",endpoint="catalog"} 0
1196 | prometheus_sd_consul_rpc_duration_seconds{call="services",endpoint="catalog",quantile="0.5"} NaN
1197 | prometheus_sd_consul_rpc_duration_seconds{call="services",endpoint="catalog",quantile="0.9"} NaN
1198 | prometheus_sd_consul_rpc_duration_seconds{call="services",endpoint="catalog",quantile="0.99"} NaN
1199 | prometheus_sd_consul_rpc_duration_seconds_sum{call="services",endpoint="catalog"} 0
1200 | prometheus_sd_consul_rpc_duration_seconds_count{call="services",endpoint="catalog"} 0
1201 | # HELP prometheus_sd_consul_rpc_failures_total The number of Consul RPC call failures.
1202 | # TYPE prometheus_sd_consul_rpc_failures_total counter
1203 | prometheus_sd_consul_rpc_failures_total 0
1204 | # HELP prometheus_sd_discovered_targets Current number of discovered targets.
1205 | # TYPE prometheus_sd_discovered_targets gauge
1206 | prometheus_sd_discovered_targets{config="alertmanager",name="scrape"} 1
1207 | prometheus_sd_discovered_targets{config="blackbox",name="scrape"} 1
1208 | prometheus_sd_discovered_targets{config="caddy",name="scrape"} 1
1209 | prometheus_sd_discovered_targets{config="config-0",name="notify"} 1
1210 | prometheus_sd_discovered_targets{config="grafana",name="scrape"} 1
1211 | prometheus_sd_discovered_targets{config="node",name="scrape"} 1
1212 | prometheus_sd_discovered_targets{config="prometheus",name="scrape"} 1
1213 | prometheus_sd_discovered_targets{config="random",name="scrape"} 4
1214 | # HELP prometheus_sd_dns_lookup_failures_total The number of DNS-SD lookup failures.
1215 | # TYPE prometheus_sd_dns_lookup_failures_total counter
1216 | prometheus_sd_dns_lookup_failures_total 0
1217 | # HELP prometheus_sd_dns_lookups_total The number of DNS-SD lookups.
1218 | # TYPE prometheus_sd_dns_lookups_total counter
1219 | prometheus_sd_dns_lookups_total 0
1220 | # HELP prometheus_sd_failed_configs Current number of service discovery configurations that failed to load.
1221 | # TYPE prometheus_sd_failed_configs gauge
1222 | prometheus_sd_failed_configs{name="notify"} 0
1223 | prometheus_sd_failed_configs{name="scrape"} 0
1224 | # HELP prometheus_sd_file_mtime_seconds Timestamp (mtime) of files read by FileSD. Timestamp is set at read time.
1225 | # TYPE prometheus_sd_file_mtime_seconds gauge
1226 | prometheus_sd_file_mtime_seconds{filename="/etc/prometheus/file_sd/alertmanager.yml"} 1.579263725e+09
1227 | prometheus_sd_file_mtime_seconds{filename="/etc/prometheus/file_sd/node.yml"} 1.579263722e+09
1228 | prometheus_sd_file_mtime_seconds{filename="/etc/prometheus/file_sd/random.yml"} 1.579263729e+09
1229 | # HELP prometheus_sd_file_read_errors_total The number of File-SD read errors.
1230 | # TYPE prometheus_sd_file_read_errors_total counter
1231 | prometheus_sd_file_read_errors_total 0
1232 | # HELP prometheus_sd_file_scan_duration_seconds The duration of the File-SD scan in seconds.
1233 | # TYPE prometheus_sd_file_scan_duration_seconds summary
1234 | prometheus_sd_file_scan_duration_seconds{quantile="0.5"} 0.000142029
1235 | prometheus_sd_file_scan_duration_seconds{quantile="0.9"} 0.00027813
1236 | prometheus_sd_file_scan_duration_seconds{quantile="0.99"} 0.00027813
1237 | prometheus_sd_file_scan_duration_seconds_sum 2747.4395637840016
1238 | prometheus_sd_file_scan_duration_seconds_count 1047
1239 | # HELP prometheus_sd_kubernetes_events_total The number of Kubernetes events handled.
1240 | # TYPE prometheus_sd_kubernetes_events_total counter
1241 | prometheus_sd_kubernetes_events_total{event="add",role="endpoints"} 0
1242 | prometheus_sd_kubernetes_events_total{event="add",role="endpointslice"} 0
1243 | prometheus_sd_kubernetes_events_total{event="add",role="ingress"} 0
1244 | prometheus_sd_kubernetes_events_total{event="add",role="node"} 0
1245 | prometheus_sd_kubernetes_events_total{event="add",role="pod"} 0
1246 | prometheus_sd_kubernetes_events_total{event="add",role="service"} 0
1247 | prometheus_sd_kubernetes_events_total{event="delete",role="endpoints"} 0
1248 | prometheus_sd_kubernetes_events_total{event="delete",role="endpointslice"} 0
1249 | prometheus_sd_kubernetes_events_total{event="delete",role="ingress"} 0
1250 | prometheus_sd_kubernetes_events_total{event="delete",role="node"} 0
1251 | prometheus_sd_kubernetes_events_total{event="delete",role="pod"} 0
1252 | prometheus_sd_kubernetes_events_total{event="delete",role="service"} 0
1253 | prometheus_sd_kubernetes_events_total{event="update",role="endpoints"} 0
1254 | prometheus_sd_kubernetes_events_total{event="update",role="endpointslice"} 0
1255 | prometheus_sd_kubernetes_events_total{event="update",role="ingress"} 0
1256 | prometheus_sd_kubernetes_events_total{event="update",role="node"} 0
1257 | prometheus_sd_kubernetes_events_total{event="update",role="pod"} 0
1258 | prometheus_sd_kubernetes_events_total{event="update",role="service"} 0
1259 | # HELP prometheus_sd_received_updates_total Total number of update events received from the SD providers.
1260 | # TYPE prometheus_sd_received_updates_total counter
1261 | prometheus_sd_received_updates_total{name="notify"} 2
1262 | prometheus_sd_received_updates_total{name="scrape"} 1055
1263 | # HELP prometheus_sd_updates_total Total number of update events sent to the SD consumers.
1264 | # TYPE prometheus_sd_updates_total counter
1265 | prometheus_sd_updates_total{name="notify"} 1
1266 | prometheus_sd_updates_total{name="scrape"} 360
1267 | # HELP prometheus_target_interval_length_seconds Actual intervals between scrapes.
1268 | # TYPE prometheus_target_interval_length_seconds summary
1269 | prometheus_target_interval_length_seconds{interval="15s",quantile="0.01"} 14.99902034
1270 | prometheus_target_interval_length_seconds{interval="15s",quantile="0.05"} 14.999159904
1271 | prometheus_target_interval_length_seconds{interval="15s",quantile="0.5"} 15.000030997
1272 | prometheus_target_interval_length_seconds{interval="15s",quantile="0.9"} 15.000660627
1273 | prometheus_target_interval_length_seconds{interval="15s",quantile="0.99"} 15.001022852
1274 | prometheus_target_interval_length_seconds_sum{interval="15s"} 1.0456697785050593e+06
1275 | prometheus_target_interval_length_seconds_count{interval="15s"} 68644
1276 | # HELP prometheus_target_metadata_cache_bytes The number of bytes that are currently used for storing metric metadata in the cache
1277 | # TYPE prometheus_target_metadata_cache_bytes gauge
1278 | prometheus_target_metadata_cache_bytes{scrape_job="alertmanager"} 4115
1279 | prometheus_target_metadata_cache_bytes{scrape_job="blackbox"} 661
1280 | prometheus_target_metadata_cache_bytes{scrape_job="caddy"} 2288
1281 | prometheus_target_metadata_cache_bytes{scrape_job="grafana"} 9373
1282 | prometheus_target_metadata_cache_bytes{scrape_job="node"} 11855
1283 | prometheus_target_metadata_cache_bytes{scrape_job="prometheus"} 9880
1284 | prometheus_target_metadata_cache_bytes{scrape_job="random"} 7364
1285 | # HELP prometheus_target_metadata_cache_entries Total number of metric metadata entries in the cache
1286 | # TYPE prometheus_target_metadata_cache_entries gauge
1287 | prometheus_target_metadata_cache_entries{scrape_job="alertmanager"} 75
1288 | prometheus_target_metadata_cache_entries{scrape_job="blackbox"} 13
1289 | prometheus_target_metadata_cache_entries{scrape_job="caddy"} 45
1290 | prometheus_target_metadata_cache_entries{scrape_job="grafana"} 159
1291 | prometheus_target_metadata_cache_entries{scrape_job="node"} 262
1292 | prometheus_target_metadata_cache_entries{scrape_job="prometheus"} 169
1293 | prometheus_target_metadata_cache_entries{scrape_job="random"} 148
1294 | # HELP prometheus_target_scrape_pool_exceeded_label_limits_total Total number of times scrape pools hit the label limits, during sync or config reload.
1295 | # TYPE prometheus_target_scrape_pool_exceeded_label_limits_total counter
1296 | prometheus_target_scrape_pool_exceeded_label_limits_total 0
1297 | # HELP prometheus_target_scrape_pool_exceeded_target_limit_total Total number of times scrape pools hit the target limit, during sync or config reload.
1298 | # TYPE prometheus_target_scrape_pool_exceeded_target_limit_total counter
1299 | prometheus_target_scrape_pool_exceeded_target_limit_total 0
1300 | # HELP prometheus_target_scrape_pool_reloads_failed_total Total number of failed scrape pool reloads.
1301 | # TYPE prometheus_target_scrape_pool_reloads_failed_total counter
1302 | prometheus_target_scrape_pool_reloads_failed_total 0
1303 | # HELP prometheus_target_scrape_pool_reloads_total Total number of scrape pool reloads.
1304 | # TYPE prometheus_target_scrape_pool_reloads_total counter
1305 | prometheus_target_scrape_pool_reloads_total 0
1306 | # HELP prometheus_target_scrape_pool_sync_total Total number of syncs that were executed on a scrape pool.
1307 | # TYPE prometheus_target_scrape_pool_sync_total counter
1308 | prometheus_target_scrape_pool_sync_total{scrape_job="alertmanager"} 355
1309 | prometheus_target_scrape_pool_sync_total{scrape_job="blackbox"} 355
1310 | prometheus_target_scrape_pool_sync_total{scrape_job="caddy"} 355
1311 | prometheus_target_scrape_pool_sync_total{scrape_job="grafana"} 355
1312 | prometheus_target_scrape_pool_sync_total{scrape_job="node"} 355
1313 | prometheus_target_scrape_pool_sync_total{scrape_job="prometheus"} 355
1314 | prometheus_target_scrape_pool_sync_total{scrape_job="random"} 355
1315 | # HELP prometheus_target_scrape_pool_targets Current number of targets in this scrape pool.
1316 | # TYPE prometheus_target_scrape_pool_targets gauge
1317 | prometheus_target_scrape_pool_targets{scrape_job="alertmanager"} 1
1318 | prometheus_target_scrape_pool_targets{scrape_job="blackbox"} 1
1319 | prometheus_target_scrape_pool_targets{scrape_job="caddy"} 1
1320 | prometheus_target_scrape_pool_targets{scrape_job="grafana"} 1
1321 | prometheus_target_scrape_pool_targets{scrape_job="node"} 1
1322 | prometheus_target_scrape_pool_targets{scrape_job="prometheus"} 1
1323 | prometheus_target_scrape_pool_targets{scrape_job="random"} 4
1324 | # HELP prometheus_target_scrape_pools_failed_total Total number of scrape pool creations that failed.
1325 | # TYPE prometheus_target_scrape_pools_failed_total counter
1326 | prometheus_target_scrape_pools_failed_total 0
1327 | # HELP prometheus_target_scrape_pools_total Total number of scrape pool creation attempts.
1328 | # TYPE prometheus_target_scrape_pools_total counter
1329 | prometheus_target_scrape_pools_total 7
1330 | # HELP prometheus_target_scrapes_cache_flush_forced_total How many times a scrape cache was flushed due to getting big while scrapes are failing.
1331 | # TYPE prometheus_target_scrapes_cache_flush_forced_total counter
1332 | prometheus_target_scrapes_cache_flush_forced_total 0
1333 | # HELP prometheus_target_scrapes_exceeded_sample_limit_total Total number of scrapes that hit the sample limit and were rejected.
1334 | # TYPE prometheus_target_scrapes_exceeded_sample_limit_total counter
1335 | prometheus_target_scrapes_exceeded_sample_limit_total 0
1336 | # HELP prometheus_target_scrapes_exemplar_out_of_order_total Total number of exemplar rejected due to not being out of the expected order.
1337 | # TYPE prometheus_target_scrapes_exemplar_out_of_order_total counter
1338 | prometheus_target_scrapes_exemplar_out_of_order_total 0
1339 | # HELP prometheus_target_scrapes_sample_duplicate_timestamp_total Total number of samples rejected due to duplicate timestamps but different values.
1340 | # TYPE prometheus_target_scrapes_sample_duplicate_timestamp_total counter
1341 | prometheus_target_scrapes_sample_duplicate_timestamp_total 0
1342 | # HELP prometheus_target_scrapes_sample_out_of_bounds_total Total number of samples rejected due to timestamp falling outside of the time bounds.
1343 | # TYPE prometheus_target_scrapes_sample_out_of_bounds_total counter
1344 | prometheus_target_scrapes_sample_out_of_bounds_total 0
1345 | # HELP prometheus_target_scrapes_sample_out_of_order_total Total number of samples rejected due to not being out of the expected order.
1346 | # TYPE prometheus_target_scrapes_sample_out_of_order_total counter
1347 | prometheus_target_scrapes_sample_out_of_order_total 0
1348 | # HELP prometheus_target_sync_length_seconds Actual interval to sync the scrape pool.
1349 | # TYPE prometheus_target_sync_length_seconds summary
1350 | prometheus_target_sync_length_seconds{scrape_job="alertmanager",quantile="0.01"} 1.2456e-05
1351 | prometheus_target_sync_length_seconds{scrape_job="alertmanager",quantile="0.05"} 1.2456e-05
1352 | prometheus_target_sync_length_seconds{scrape_job="alertmanager",quantile="0.5"} 1.2456e-05
1353 | prometheus_target_sync_length_seconds{scrape_job="alertmanager",quantile="0.9"} 6.7242e-05
1354 | prometheus_target_sync_length_seconds{scrape_job="alertmanager",quantile="0.99"} 6.7242e-05
1355 | prometheus_target_sync_length_seconds_sum{scrape_job="alertmanager"} 234.00604229200007
1356 | prometheus_target_sync_length_seconds_count{scrape_job="alertmanager"} 355
1357 | prometheus_target_sync_length_seconds{scrape_job="blackbox",quantile="0.01"} 6.9759e-05
1358 | prometheus_target_sync_length_seconds{scrape_job="blackbox",quantile="0.05"} 6.9759e-05
1359 | prometheus_target_sync_length_seconds{scrape_job="blackbox",quantile="0.5"} 6.9759e-05
1360 | prometheus_target_sync_length_seconds{scrape_job="blackbox",quantile="0.9"} 0.000104859
1361 | prometheus_target_sync_length_seconds{scrape_job="blackbox",quantile="0.99"} 0.000104859
1362 | prometheus_target_sync_length_seconds_sum{scrape_job="blackbox"} 458.39950076700006
1363 | prometheus_target_sync_length_seconds_count{scrape_job="blackbox"} 355
1364 | prometheus_target_sync_length_seconds{scrape_job="caddy",quantile="0.01"} 1.5472e-05
1365 | prometheus_target_sync_length_seconds{scrape_job="caddy",quantile="0.05"} 1.5472e-05
1366 | prometheus_target_sync_length_seconds{scrape_job="caddy",quantile="0.5"} 1.5472e-05
1367 | prometheus_target_sync_length_seconds{scrape_job="caddy",quantile="0.9"} 1.8145e-05
1368 | prometheus_target_sync_length_seconds{scrape_job="caddy",quantile="0.99"} 1.8145e-05
1369 | prometheus_target_sync_length_seconds_sum{scrape_job="caddy"} 228.55223250899996
1370 | prometheus_target_sync_length_seconds_count{scrape_job="caddy"} 355
1371 | prometheus_target_sync_length_seconds{scrape_job="grafana",quantile="0.01"} 1.18e-05
1372 | prometheus_target_sync_length_seconds{scrape_job="grafana",quantile="0.05"} 1.18e-05
1373 | prometheus_target_sync_length_seconds{scrape_job="grafana",quantile="0.5"} 1.18e-05
1374 | prometheus_target_sync_length_seconds{scrape_job="grafana",quantile="0.9"} 1.5709e-05
1375 | prometheus_target_sync_length_seconds{scrape_job="grafana",quantile="0.99"} 1.5709e-05
1376 | prometheus_target_sync_length_seconds_sum{scrape_job="grafana"} 235.80302621100014
1377 | prometheus_target_sync_length_seconds_count{scrape_job="grafana"} 355
1378 | prometheus_target_sync_length_seconds{scrape_job="node",quantile="0.01"} 1.5431e-05
1379 | prometheus_target_sync_length_seconds{scrape_job="node",quantile="0.05"} 1.5431e-05
1380 | prometheus_target_sync_length_seconds{scrape_job="node",quantile="0.5"} 1.5431e-05
1381 | prometheus_target_sync_length_seconds{scrape_job="node",quantile="0.9"} 2.5602e-05
1382 | prometheus_target_sync_length_seconds{scrape_job="node",quantile="0.99"} 2.5602e-05
1383 | prometheus_target_sync_length_seconds_sum{scrape_job="node"} 305.9180211300003
1384 | prometheus_target_sync_length_seconds_count{scrape_job="node"} 355
1385 | prometheus_target_sync_length_seconds{scrape_job="prometheus",quantile="0.01"} 1.3322e-05
1386 | prometheus_target_sync_length_seconds{scrape_job="prometheus",quantile="0.05"} 1.3322e-05
1387 | prometheus_target_sync_length_seconds{scrape_job="prometheus",quantile="0.5"} 1.3322e-05
1388 | prometheus_target_sync_length_seconds{scrape_job="prometheus",quantile="0.9"} 0.000115182
1389 | prometheus_target_sync_length_seconds{scrape_job="prometheus",quantile="0.99"} 0.000115182
1390 | prometheus_target_sync_length_seconds_sum{scrape_job="prometheus"} 229.84317737000006
1391 | prometheus_target_sync_length_seconds_count{scrape_job="prometheus"} 355
1392 | prometheus_target_sync_length_seconds{scrape_job="random",quantile="0.01"} 6.3767e-05
1393 | prometheus_target_sync_length_seconds{scrape_job="random",quantile="0.05"} 6.3767e-05
1394 | prometheus_target_sync_length_seconds{scrape_job="random",quantile="0.5"} 6.3767e-05
1395 | prometheus_target_sync_length_seconds{scrape_job="random",quantile="0.9"} 0.000103281
1396 | prometheus_target_sync_length_seconds{scrape_job="random",quantile="0.99"} 0.000103281
1397 | prometheus_target_sync_length_seconds_sum{scrape_job="random"} 584.8811138559998
1398 | prometheus_target_sync_length_seconds_count{scrape_job="random"} 355
1399 | # HELP prometheus_template_text_expansion_failures_total The total number of template text expansion failures.
1400 | # TYPE prometheus_template_text_expansion_failures_total counter
1401 | prometheus_template_text_expansion_failures_total 0
1402 | # HELP prometheus_template_text_expansions_total The total number of template text expansions.
1403 | # TYPE prometheus_template_text_expansions_total counter
1404 | prometheus_template_text_expansions_total 20679
1405 | # HELP prometheus_treecache_watcher_goroutines The current number of watcher goroutines.
1406 | # TYPE prometheus_treecache_watcher_goroutines gauge
1407 | prometheus_treecache_watcher_goroutines 0
1408 | # HELP prometheus_treecache_zookeeper_failures_total The total number of ZooKeeper failures.
1409 | # TYPE prometheus_treecache_zookeeper_failures_total counter
1410 | prometheus_treecache_zookeeper_failures_total 0
1411 | # HELP prometheus_tsdb_blocks_loaded Number of currently loaded data blocks
1412 | # TYPE prometheus_tsdb_blocks_loaded gauge
1413 | prometheus_tsdb_blocks_loaded 18
1414 | # HELP prometheus_tsdb_checkpoint_creations_failed_total Total number of checkpoint creations that failed.
1415 | # TYPE prometheus_tsdb_checkpoint_creations_failed_total counter
1416 | prometheus_tsdb_checkpoint_creations_failed_total 0
1417 | # HELP prometheus_tsdb_checkpoint_creations_total Total number of checkpoint creations attempted.
1418 | # TYPE prometheus_tsdb_checkpoint_creations_total counter
1419 | prometheus_tsdb_checkpoint_creations_total 8
1420 | # HELP prometheus_tsdb_checkpoint_deletions_failed_total Total number of checkpoint deletions that failed.
1421 | # TYPE prometheus_tsdb_checkpoint_deletions_failed_total counter
1422 | prometheus_tsdb_checkpoint_deletions_failed_total 0
1423 | # HELP prometheus_tsdb_checkpoint_deletions_total Total number of checkpoint deletions attempted.
1424 | # TYPE prometheus_tsdb_checkpoint_deletions_total counter
1425 | prometheus_tsdb_checkpoint_deletions_total 8
1426 | # HELP prometheus_tsdb_compaction_chunk_range_seconds Final time range of chunks on their first compaction
1427 | # TYPE prometheus_tsdb_compaction_chunk_range_seconds histogram
1428 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="100"} 2
1429 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="400"} 2
1430 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="1600"} 2
1431 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="6400"} 2
1432 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="25600"} 4
1433 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="102400"} 5
1434 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="409600"} 9
1435 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="1.6384e+06"} 16301
1436 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="6.5536e+06"} 711264
1437 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="2.62144e+07"} 711264
1438 | prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="+Inf"} 711264
1439 | prometheus_tsdb_compaction_chunk_range_seconds_sum 1.288288025829e+12
1440 | prometheus_tsdb_compaction_chunk_range_seconds_count 711264
1441 | # HELP prometheus_tsdb_compaction_chunk_samples Final number of samples on their first compaction
1442 | # TYPE prometheus_tsdb_compaction_chunk_samples histogram
1443 | prometheus_tsdb_compaction_chunk_samples_bucket{le="4"} 5
1444 | prometheus_tsdb_compaction_chunk_samples_bucket{le="6"} 5
1445 | prometheus_tsdb_compaction_chunk_samples_bucket{le="9"} 5
1446 | prometheus_tsdb_compaction_chunk_samples_bucket{le="13.5"} 5
1447 | prometheus_tsdb_compaction_chunk_samples_bucket{le="20.25"} 9
1448 | prometheus_tsdb_compaction_chunk_samples_bucket{le="30.375"} 9
1449 | prometheus_tsdb_compaction_chunk_samples_bucket{le="45.5625"} 9
1450 | prometheus_tsdb_compaction_chunk_samples_bucket{le="68.34375"} 12318
1451 | prometheus_tsdb_compaction_chunk_samples_bucket{le="102.515625"} 12905
1452 | prometheus_tsdb_compaction_chunk_samples_bucket{le="153.7734375"} 688088
1453 | prometheus_tsdb_compaction_chunk_samples_bucket{le="230.66015625"} 700757
1454 | prometheus_tsdb_compaction_chunk_samples_bucket{le="345.990234375"} 711264
1455 | prometheus_tsdb_compaction_chunk_samples_bucket{le="+Inf"} 711264
1456 | prometheus_tsdb_compaction_chunk_samples_sum 8.6497607e+07
1457 | prometheus_tsdb_compaction_chunk_samples_count 711264
1458 | # HELP prometheus_tsdb_compaction_chunk_size_bytes Final size of chunks on their first compaction
1459 | # TYPE prometheus_tsdb_compaction_chunk_size_bytes histogram
1460 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="32"} 38
1461 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="48"} 246270
1462 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="72"} 580526
1463 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="108"} 652308
1464 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="162"} 665180
1465 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="243"} 684579
1466 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="364.5"} 697519
1467 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="546.75"} 703072
1468 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="820.125"} 707078
1469 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="1230.1875"} 710978
1470 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="1845.28125"} 711107
1471 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="2767.921875"} 711264
1472 | prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="+Inf"} 711264
1473 | prometheus_tsdb_compaction_chunk_size_bytes_sum 5.5669551e+07
1474 | prometheus_tsdb_compaction_chunk_size_bytes_count 711264
1475 | # HELP prometheus_tsdb_compaction_duration_seconds Duration of compaction runs
1476 | # TYPE prometheus_tsdb_compaction_duration_seconds histogram
1477 | prometheus_tsdb_compaction_duration_seconds_bucket{le="1"} 16
1478 | prometheus_tsdb_compaction_duration_seconds_bucket{le="2"} 21
1479 | prometheus_tsdb_compaction_duration_seconds_bucket{le="4"} 23
1480 | prometheus_tsdb_compaction_duration_seconds_bucket{le="8"} 23
1481 | prometheus_tsdb_compaction_duration_seconds_bucket{le="16"} 23
1482 | prometheus_tsdb_compaction_duration_seconds_bucket{le="32"} 23
1483 | prometheus_tsdb_compaction_duration_seconds_bucket{le="64"} 23
1484 | prometheus_tsdb_compaction_duration_seconds_bucket{le="128"} 23
1485 | prometheus_tsdb_compaction_duration_seconds_bucket{le="256"} 23
1486 | prometheus_tsdb_compaction_duration_seconds_bucket{le="512"} 23
1487 | prometheus_tsdb_compaction_duration_seconds_bucket{le="1024"} 23
1488 | prometheus_tsdb_compaction_duration_seconds_bucket{le="2048"} 23
1489 | prometheus_tsdb_compaction_duration_seconds_bucket{le="4096"} 23
1490 | prometheus_tsdb_compaction_duration_seconds_bucket{le="8192"} 23
1491 | prometheus_tsdb_compaction_duration_seconds_bucket{le="+Inf"} 23
1492 | prometheus_tsdb_compaction_duration_seconds_sum 20.378122834000003
1493 | prometheus_tsdb_compaction_duration_seconds_count 23
1494 | # HELP prometheus_tsdb_compaction_populating_block Set to 1 when a block is currently being written to the disk.
1495 | # TYPE prometheus_tsdb_compaction_populating_block gauge
1496 | prometheus_tsdb_compaction_populating_block 0
1497 | # HELP prometheus_tsdb_compactions_failed_total Total number of compactions that failed for the partition.
1498 | # TYPE prometheus_tsdb_compactions_failed_total counter
1499 | prometheus_tsdb_compactions_failed_total 0
1500 | # HELP prometheus_tsdb_compactions_skipped_total Total number of skipped compactions due to disabled auto compaction.
1501 | # TYPE prometheus_tsdb_compactions_skipped_total counter
1502 | prometheus_tsdb_compactions_skipped_total 0
1503 | # HELP prometheus_tsdb_compactions_total Total number of compactions that were executed for the partition.
1504 | # TYPE prometheus_tsdb_compactions_total counter
1505 | prometheus_tsdb_compactions_total 23
1506 | # HELP prometheus_tsdb_compactions_triggered_total Total number of triggered compactions for the partition.
1507 | # TYPE prometheus_tsdb_compactions_triggered_total counter
1508 | prometheus_tsdb_compactions_triggered_total 1715
1509 | # HELP prometheus_tsdb_data_replay_duration_seconds Time taken to replay the data on disk.
1510 | # TYPE prometheus_tsdb_data_replay_duration_seconds gauge
1511 | prometheus_tsdb_data_replay_duration_seconds 3.645880927
1512 | # HELP prometheus_tsdb_head_active_appenders Number of currently active appender transactions
1513 | # TYPE prometheus_tsdb_head_active_appenders gauge
1514 | prometheus_tsdb_head_active_appenders 0
1515 | # HELP prometheus_tsdb_head_chunks Total number of chunks in the head block.
1516 | # TYPE prometheus_tsdb_head_chunks gauge
1517 | prometheus_tsdb_head_chunks 61670
1518 | # HELP prometheus_tsdb_head_chunks_created_total Total number of chunks created in the head
1519 | # TYPE prometheus_tsdb_head_chunks_created_total counter
1520 | prometheus_tsdb_head_chunks_created_total 772934
1521 | # HELP prometheus_tsdb_head_chunks_removed_total Total number of chunks removed in the head
1522 | # TYPE prometheus_tsdb_head_chunks_removed_total counter
1523 | prometheus_tsdb_head_chunks_removed_total 711264
1524 | # HELP prometheus_tsdb_head_gc_duration_seconds Runtime of garbage collection in the head block.
1525 | # TYPE prometheus_tsdb_head_gc_duration_seconds summary
1526 | prometheus_tsdb_head_gc_duration_seconds_sum 0.37159655
1527 | prometheus_tsdb_head_gc_duration_seconds_count 15
1528 | # HELP prometheus_tsdb_head_max_time Maximum timestamp of the head block. The unit is decided by the library consumer.
1529 | # TYPE prometheus_tsdb_head_max_time gauge
1530 | prometheus_tsdb_head_max_time 1.657368229917e+12
1531 | # HELP prometheus_tsdb_head_max_time_seconds Maximum timestamp of the head block.
1532 | # TYPE prometheus_tsdb_head_max_time_seconds gauge
1533 | prometheus_tsdb_head_max_time_seconds 1.657368229e+09
1534 | # HELP prometheus_tsdb_head_min_time Minimum time bound of the head block. The unit is decided by the library consumer.
1535 | # TYPE prometheus_tsdb_head_min_time gauge
1536 | prometheus_tsdb_head_min_time 1.657360800079e+12
1537 | # HELP prometheus_tsdb_head_min_time_seconds Minimum time bound of the head block.
1538 | # TYPE prometheus_tsdb_head_min_time_seconds gauge
1539 | prometheus_tsdb_head_min_time_seconds 1.6573608e+09
1540 | # HELP prometheus_tsdb_head_samples_appended_total Total number of appended samples.
1541 | # TYPE prometheus_tsdb_head_samples_appended_total counter
1542 | prometheus_tsdb_head_samples_appended_total 8.4116578e+07
1543 | # HELP prometheus_tsdb_head_series Total number of series in the head block.
1544 | # TYPE prometheus_tsdb_head_series gauge
1545 | prometheus_tsdb_head_series 12334
1546 | # HELP prometheus_tsdb_head_series_created_total Total number of series created in the head
1547 | # TYPE prometheus_tsdb_head_series_created_total counter
1548 | prometheus_tsdb_head_series_created_total 12680
1549 | # HELP prometheus_tsdb_head_series_not_found_total Total number of requests for series that were not found.
1550 | # TYPE prometheus_tsdb_head_series_not_found_total counter
1551 | prometheus_tsdb_head_series_not_found_total 0
1552 | # HELP prometheus_tsdb_head_series_removed_total Total number of series removed in the head
1553 | # TYPE prometheus_tsdb_head_series_removed_total counter
1554 | prometheus_tsdb_head_series_removed_total 346
1555 | # HELP prometheus_tsdb_head_truncations_failed_total Total number of head truncations that failed.
1556 | # TYPE prometheus_tsdb_head_truncations_failed_total counter
1557 | prometheus_tsdb_head_truncations_failed_total 0
1558 | # HELP prometheus_tsdb_head_truncations_total Total number of head truncations attempted.
1559 | # TYPE prometheus_tsdb_head_truncations_total counter
1560 | prometheus_tsdb_head_truncations_total 15
1561 | # HELP prometheus_tsdb_isolation_high_watermark The highest TSDB append ID that has been given out.
1562 | # TYPE prometheus_tsdb_isolation_high_watermark gauge
1563 | prometheus_tsdb_isolation_high_watermark 404445
1564 | # HELP prometheus_tsdb_isolation_low_watermark The lowest TSDB append ID that is still referenced.
1565 | # TYPE prometheus_tsdb_isolation_low_watermark gauge
1566 | prometheus_tsdb_isolation_low_watermark 404445
1567 | # HELP prometheus_tsdb_lowest_timestamp Lowest timestamp value stored in the database. The unit is decided by the library consumer.
1568 | # TYPE prometheus_tsdb_lowest_timestamp gauge
1569 | prometheus_tsdb_lowest_timestamp 1.654538400079e+12
1570 | # HELP prometheus_tsdb_lowest_timestamp_seconds Lowest timestamp value stored in the database.
1571 | # TYPE prometheus_tsdb_lowest_timestamp_seconds gauge
1572 | prometheus_tsdb_lowest_timestamp_seconds 1.6545384e+09
1573 | # HELP prometheus_tsdb_mmap_chunk_corruptions_total Total number of memory-mapped chunk corruptions.
1574 | # TYPE prometheus_tsdb_mmap_chunk_corruptions_total counter
1575 | prometheus_tsdb_mmap_chunk_corruptions_total 0
1576 | # HELP prometheus_tsdb_out_of_bound_samples_total Total number of out of bound samples ingestion failed attempts.
1577 | # TYPE prometheus_tsdb_out_of_bound_samples_total counter
1578 | prometheus_tsdb_out_of_bound_samples_total 0
1579 | # HELP prometheus_tsdb_out_of_order_samples_total Total number of out of order samples ingestion failed attempts.
1580 | # TYPE prometheus_tsdb_out_of_order_samples_total counter
1581 | prometheus_tsdb_out_of_order_samples_total 0
1582 | # HELP prometheus_tsdb_reloads_failures_total Number of times the database failed to reloadBlocks block data from disk.
1583 | # TYPE prometheus_tsdb_reloads_failures_total counter
1584 | prometheus_tsdb_reloads_failures_total 0
1585 | # HELP prometheus_tsdb_reloads_total Number of times the database reloaded block data from disk.
1586 | # TYPE prometheus_tsdb_reloads_total counter
1587 | prometheus_tsdb_reloads_total 1724
1588 | # HELP prometheus_tsdb_retention_limit_bytes Max number of bytes to be retained in the tsdb blocks, configured 0 means disabled
1589 | # TYPE prometheus_tsdb_retention_limit_bytes gauge
1590 | prometheus_tsdb_retention_limit_bytes 0
1591 | # HELP prometheus_tsdb_size_retentions_total The number of times that blocks were deleted because the maximum number of bytes was exceeded.
1592 | # TYPE prometheus_tsdb_size_retentions_total counter
1593 | prometheus_tsdb_size_retentions_total 0
1594 | # HELP prometheus_tsdb_storage_blocks_bytes The number of bytes that are currently used for local storage by all blocks.
1595 | # TYPE prometheus_tsdb_storage_blocks_bytes gauge
1596 | prometheus_tsdb_storage_blocks_bytes 1.694247359e+09
1597 | # HELP prometheus_tsdb_symbol_table_size_bytes Size of symbol table in memory for loaded blocks
1598 | # TYPE prometheus_tsdb_symbol_table_size_bytes gauge
1599 | prometheus_tsdb_symbol_table_size_bytes 6912
1600 | # HELP prometheus_tsdb_time_retentions_total The number of times that blocks were deleted because the maximum time limit was exceeded.
1601 | # TYPE prometheus_tsdb_time_retentions_total counter
1602 | prometheus_tsdb_time_retentions_total 0
1603 | # HELP prometheus_tsdb_tombstone_cleanup_seconds The time taken to recompact blocks to remove tombstones.
1604 | # TYPE prometheus_tsdb_tombstone_cleanup_seconds histogram
1605 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.005"} 0
1606 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.01"} 0
1607 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.025"} 0
1608 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.05"} 0
1609 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.1"} 0
1610 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.25"} 0
1611 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.5"} 0
1612 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="1"} 0
1613 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="2.5"} 0
1614 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="5"} 0
1615 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="10"} 0
1616 | prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="+Inf"} 0
1617 | prometheus_tsdb_tombstone_cleanup_seconds_sum 0
1618 | prometheus_tsdb_tombstone_cleanup_seconds_count 0
1619 | # HELP prometheus_tsdb_vertical_compactions_total Total number of compactions done on overlapping blocks.
1620 | # TYPE prometheus_tsdb_vertical_compactions_total counter
1621 | prometheus_tsdb_vertical_compactions_total 0
1622 | # HELP prometheus_tsdb_wal_completed_pages_total Total number of completed pages.
1623 | # TYPE prometheus_tsdb_wal_completed_pages_total counter
1624 | prometheus_tsdb_wal_completed_pages_total 14368
1625 | # HELP prometheus_tsdb_wal_corruptions_total Total number of WAL corruptions.
1626 | # TYPE prometheus_tsdb_wal_corruptions_total counter
1627 | prometheus_tsdb_wal_corruptions_total 0
1628 | # HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync.
1629 | # TYPE prometheus_tsdb_wal_fsync_duration_seconds summary
1630 | prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} NaN
1631 | prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.9"} NaN
1632 | prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.99"} NaN
1633 | prometheus_tsdb_wal_fsync_duration_seconds_sum 0.050861694
1634 | prometheus_tsdb_wal_fsync_duration_seconds_count 15
1635 | # HELP prometheus_tsdb_wal_page_flushes_total Total number of page flushes.
1636 | # TYPE prometheus_tsdb_wal_page_flushes_total counter
1637 | prometheus_tsdb_wal_page_flushes_total 165253
1638 | # HELP prometheus_tsdb_wal_segment_current WAL segment index that TSDB is currently writing to.
1639 | # TYPE prometheus_tsdb_wal_segment_current gauge
1640 | prometheus_tsdb_wal_segment_current 11013
1641 | # HELP prometheus_tsdb_wal_truncate_duration_seconds Duration of WAL truncation.
1642 | # TYPE prometheus_tsdb_wal_truncate_duration_seconds summary
1643 | prometheus_tsdb_wal_truncate_duration_seconds_sum 11.893843546
1644 | prometheus_tsdb_wal_truncate_duration_seconds_count 8
1645 | # HELP prometheus_tsdb_wal_truncations_failed_total Total number of WAL truncations that failed.
1646 | # TYPE prometheus_tsdb_wal_truncations_failed_total counter
1647 | prometheus_tsdb_wal_truncations_failed_total 0
1648 | # HELP prometheus_tsdb_wal_truncations_total Total number of WAL truncations attempted.
1649 | # TYPE prometheus_tsdb_wal_truncations_total counter
1650 | prometheus_tsdb_wal_truncations_total 8
1651 | # HELP prometheus_tsdb_wal_writes_failed_total Total number of WAL writes that failed.
1652 | # TYPE prometheus_tsdb_wal_writes_failed_total counter
1653 | prometheus_tsdb_wal_writes_failed_total 0
1654 | # HELP prometheus_web_federation_errors_total Total number of errors that occurred while sending federation responses.
1655 | # TYPE prometheus_web_federation_errors_total counter
1656 | prometheus_web_federation_errors_total 0
1657 | # HELP prometheus_web_federation_warnings_total Total number of warnings that occurred while sending federation responses.
1658 | # TYPE prometheus_web_federation_warnings_total counter
1659 | prometheus_web_federation_warnings_total 0
1660 | # HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
1661 | # TYPE promhttp_metric_handler_requests_in_flight gauge
1662 | promhttp_metric_handler_requests_in_flight 1
1663 | # HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
1664 | # TYPE promhttp_metric_handler_requests_total counter
1665 | promhttp_metric_handler_requests_total{code="200"} 33660
1666 | promhttp_metric_handler_requests_total{code="500"} 0
1667 | promhttp_metric_handler_requests_total{code="503"} 0
1668 |
--------------------------------------------------------------------------------