mirror of
https://github.com/kubernetes-sigs/prometheus-adapter.git
synced 2026-04-06 17:57:51 +00:00
This commit introduces advanced configuration. The rate-interval and label-prefix flags are removed, and replaced by a configuration file that allows you to specify series queries and the rules for transforming those into metrics queries and API resources.
132 lines
3.6 KiB
Go
132 lines
3.6 KiB
Go
/*
|
|
Copyright 2017 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
package client
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/prometheus/common/model"
|
|
)
|
|
|
|
// NB: the official prometheus API client at https://github.com/prometheus/client_golang
|
|
// is rather lackluster -- as of the time of writing of this file, it lacked support
|
|
// for querying the series metadata, which we need for the adapter. Instead, we use
|
|
// this client.
|
|
|
|
// Selector represents a series selector
|
|
type Selector string
|
|
|
|
// Range represents a sliced time range with increments.
|
|
type Range struct {
|
|
// Start and End are the boundaries of the time range.
|
|
Start, End model.Time
|
|
// Step is the maximum time between two slices within the boundaries.
|
|
Step time.Duration
|
|
}
|
|
|
|
// Client is a Prometheus client for the Prometheus HTTP API.
|
|
// The "timeout" parameter for the HTTP API is set based on the context's deadline,
|
|
// when present and applicable.
|
|
type Client interface {
|
|
// Series lists the time series matching the given series selectors
|
|
Series(ctx context.Context, interval model.Interval, selectors ...Selector) ([]Series, error)
|
|
// Query runs a non-range query at the given time.
|
|
Query(ctx context.Context, t model.Time, query Selector) (QueryResult, error)
|
|
// QueryRange runs a range query at the given time.
|
|
QueryRange(ctx context.Context, r Range, query Selector) (QueryResult, error)
|
|
}
|
|
|
|
// QueryResult is the result of a query.
|
|
// Type will always be set, as well as one of the other fields, matching the type.
|
|
type QueryResult struct {
|
|
Type model.ValueType
|
|
|
|
Vector *model.Vector
|
|
Scalar *model.Scalar
|
|
Matrix *model.Matrix
|
|
}
|
|
|
|
func (qr *QueryResult) UnmarshalJSON(b []byte) error {
|
|
v := struct {
|
|
Type model.ValueType `json:"resultType"`
|
|
Result json.RawMessage `json:"result"`
|
|
}{}
|
|
|
|
err := json.Unmarshal(b, &v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
qr.Type = v.Type
|
|
|
|
switch v.Type {
|
|
case model.ValScalar:
|
|
var sv model.Scalar
|
|
err = json.Unmarshal(v.Result, &sv)
|
|
qr.Scalar = &sv
|
|
|
|
case model.ValVector:
|
|
var vv model.Vector
|
|
err = json.Unmarshal(v.Result, &vv)
|
|
qr.Vector = &vv
|
|
|
|
case model.ValMatrix:
|
|
var mv model.Matrix
|
|
err = json.Unmarshal(v.Result, &mv)
|
|
qr.Matrix = &mv
|
|
|
|
default:
|
|
err = fmt.Errorf("unexpected value type %q", v.Type)
|
|
}
|
|
return err
|
|
}
|
|
|
|
// Series represents a description of a series: a name and a set of labels.
|
|
// Series is roughly equivalent to model.Metrics, but has easy access to name
|
|
// and the set of non-name labels.
|
|
type Series struct {
|
|
Name string
|
|
Labels model.LabelSet
|
|
}
|
|
|
|
func (s *Series) UnmarshalJSON(data []byte) error {
|
|
var rawMetric model.Metric
|
|
err := json.Unmarshal(data, &rawMetric)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if name, ok := rawMetric[model.MetricNameLabel]; ok {
|
|
s.Name = string(name)
|
|
delete(rawMetric, model.MetricNameLabel)
|
|
}
|
|
|
|
s.Labels = model.LabelSet(rawMetric)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Series) String() string {
|
|
lblStrings := make([]string, 0, len(s.Labels))
|
|
for k, v := range s.Labels {
|
|
lblStrings = append(lblStrings, fmt.Sprintf("%s=%q", k, v))
|
|
}
|
|
return fmt.Sprintf("%s{%s}", s.Name, strings.Join(lblStrings, ","))
|
|
}
|