2018-08-22 13:08:52 +03:00
// Copyright 2018 The Prometheus 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.
2017-08-25 15:50:43 +03:00
package prometheus
import (
"errors"
"fmt"
"strings"
"unicode/utf8"
"github.com/prometheus/common/model"
)
// Labels represents a collection of label name -> value mappings. This type is
// commonly used with the With(Labels) and GetMetricWith(Labels) methods of
// metric vector Collectors, e.g.:
// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42)
//
// The other use-case is the specification of constant label pairs in Opts or to
// create a Desc.
type Labels map [ string ] string
// reservedLabelPrefix is a prefix which is not legal in user-supplied
// label names.
const reservedLabelPrefix = "__"
var errInconsistentCardinality = errors . New ( "inconsistent label cardinality" )
2017-08-25 18:58:59 +03:00
func validateValuesInLabels ( labels Labels , expectedNumberOfValues int ) error {
2017-08-25 15:50:43 +03:00
if len ( labels ) != expectedNumberOfValues {
2018-10-31 20:59:13 +03:00
return fmt . Errorf ( "%s: number of labels and values don't match: expected %d, actual %d, labels %v" , errInconsistentCardinality , expectedNumberOfValues , len ( labels ) , labels )
2017-08-25 15:50:43 +03:00
}
for name , val := range labels {
if ! utf8 . ValidString ( val ) {
return fmt . Errorf ( "label %s: value %q is not valid UTF-8" , name , val )
}
}
return nil
}
2017-08-25 18:58:59 +03:00
func validateLabelValues ( vals [ ] string , expectedNumberOfValues int ) error {
2017-08-25 15:50:43 +03:00
if len ( vals ) != expectedNumberOfValues {
return errInconsistentCardinality
}
for _ , val := range vals {
if ! utf8 . ValidString ( val ) {
return fmt . Errorf ( "label value %q is not valid UTF-8" , val )
}
}
return nil
}
func checkLabelName ( l string ) bool {
return model . LabelName ( l ) . IsValid ( ) && ! strings . HasPrefix ( l , reservedLabelPrefix )
}