├── .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 | [![Go Report 3 | Card](https://goreportcard.com/badge/github.com/fusakla/autograf)](https://goreportcard.com/report/github.com/fusakla/autograf) 4 | [![GitHub actions 5 | CI](https://img.shields.io/github/actions/workflow/status/fusakla/autograf/go.yaml)](https://github.com/fusakla/autograf/actions?query=branch%3Amain) 6 | [![Docker Pulls](https://img.shields.io/docker/pulls/fusakla/autograf)](https://hub.docker.com/r/fusakla/autograf) 7 | [![GitHub binaries 8 | download](https://img.shields.io/github/downloads/fusakla/autograf/total?label=Prebuilt%20binaries%20downloads)](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 | --------------------------------------------------------------------------------