cloudflare/pint

Public

mirrored from https://github.com/cloudflare/pintAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.22.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

internal/promapi/metadata.go

73lines · modecode

1package promapi
2
3import (
4 "context"
5 "crypto/sha1"
6 "fmt"
7 "io"
8
9 v1 "github.com/prometheus/client_golang/api/prometheus/v1"
10 "github.com/rs/zerolog/log"
11)
12
13type MetadataResult struct {
14 URI string
15 Metadata []v1.Metadata
16}
17
18type metadataQuery struct {
19 prom *Prometheus
20 ctx context.Context
21 metric string
22}
23
24func (q metadataQuery) Run() (any, error) {
25 log.Debug().
26 Str("uri", q.prom.uri).
27 Str("metric", q.metric).
28 Msg("Getting prometheus metrics metadata")
29
30 ctx, cancel := context.WithTimeout(q.ctx, q.prom.timeout)
31 defer cancel()
32
33 v, err := q.prom.api.Metadata(ctx, q.metric, "")
34 if err != nil {
35 return nil, fmt.Errorf("failed to query Prometheus metrics metadata: %w", err)
36 }
37 return v, nil
38}
39
40func (q metadataQuery) Endpoint() string {
41 return "/api/v1/metadata"
42}
43
44func (q metadataQuery) String() string {
45 return q.metric
46}
47
48func (q metadataQuery) CacheKey() string {
49 h := sha1.New()
50 _, _ = io.WriteString(h, q.Endpoint())
51 _, _ = io.WriteString(h, "\n")
52 _, _ = io.WriteString(h, q.metric)
53 return fmt.Sprintf("%x", h.Sum(nil))
54}
55
56func (p *Prometheus) Metadata(ctx context.Context, metric string) (*MetadataResult, error) {
57 log.Debug().Str("uri", p.uri).Str("metric", metric).Msg("Scheduling Prometheus metrics metadata query")
58
59 resultChan := make(chan queryResult)
60 p.queries <- queryRequest{
61 query: metadataQuery{prom: p, ctx: ctx, metric: metric},
62 result: resultChan,
63 }
64
65 result := <-resultChan
66 if result.err != nil {
67 return nil, QueryError{err: result.err, msg: decodeError(result.err)}
68 }
69
70 metadata := MetadataResult{URI: p.uri, Metadata: result.value.(map[string][]v1.Metadata)[metric]}
71
72 return &metadata, nil
73}
74