github.com/m3db/m3@v1.5.0/src/query/models/types.go (about)

     1  // Copyright (c) 2018 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package models
    22  
    23  import (
    24  	"bytes"
    25  	"regexp"
    26  )
    27  
    28  // Separators for tags.
    29  const (
    30  	graphiteSep  = byte('.')
    31  	sep          = byte(',')
    32  	finish       = byte('!')
    33  	eq           = byte('=')
    34  	leftBracket  = byte('{')
    35  	rightBracket = byte('}')
    36  )
    37  
    38  // IDSchemeType determines the scheme for generating
    39  // series IDs based on their tags.
    40  type IDSchemeType uint16
    41  
    42  const (
    43  	// TypeDefault is an invalid scheme that indicates that the default scheme
    44  	// for the tag options version option should be used.
    45  	TypeDefault IDSchemeType = iota
    46  	// TypeQuoted describes a scheme where IDs are generated by appending
    47  	// tag names with explicitly quoted and escaped tag values. Tag names are
    48  	// also escaped if they contain invalid characters. This is equivalent to
    49  	// the Prometheus ID style.
    50  	// {t1:v1},{t2:v2} -> {t1="v1",t2="v2"}
    51  	// {t1:v1,t2:v2}   -> {t1="v1,t2:v2"}
    52  	// {"t1":"v1"}     -> {\"t1\""="\"v1\""}
    53  	TypeQuoted
    54  	// TypePrependMeta describes a scheme where IDs are generated by prepending
    55  	// the length of each tag at the start of the ID
    56  	// {t1:v1},{t2:v2} -> 2,2,2,2!t1v1t2v2
    57  	// {t1:v1,t2:v2}   -> 2,8!t1v1,t2:v2
    58  	// {"t1":"v1"}     -> 4,4!"t1""v1"
    59  	TypePrependMeta
    60  	// TypeGraphite describes a scheme where IDs are generated to match graphite
    61  	// representation of the tags. This scheme should only be used on the graphite
    62  	// ingestion path, as it ignores tag names and is very prone to collisions if
    63  	// used on non-graphite data.
    64  	// {__g0__:v1},{__g1__:v2} -> v1.v2
    65  	//
    66  	// NB: when TypeGraphite is specified, tags are ordered numerically rather
    67  	// than lexically.
    68  	//
    69  	// NB 2: while the graphite scheme is valid, it is not available to choose as
    70  	// a general ID scheme; instead, it is set on any metric coming through the
    71  	// graphite ingestion path.
    72  	TypeGraphite
    73  )
    74  
    75  // TagOptions describes additional options for tags.
    76  type TagOptions interface {
    77  	// Validate validates these tag options.
    78  	Validate() error
    79  
    80  	// SetMetricName sets the name for the `metric name` tag.
    81  	SetMetricName(value []byte) TagOptions
    82  
    83  	// MetricName gets the name for the `metric name` tag.
    84  	MetricName() []byte
    85  
    86  	// SetBucketName sets the name for the `bucket label` tag.
    87  	SetBucketName(value []byte) TagOptions
    88  
    89  	// BucketName gets the name for the `bucket label` tag.
    90  	BucketName() []byte
    91  
    92  	// SetIDSchemeType sets the ID generation scheme type.
    93  	SetIDSchemeType(value IDSchemeType) TagOptions
    94  
    95  	// IDSchemeType gets the ID generation scheme type.
    96  	IDSchemeType() IDSchemeType
    97  
    98  	// SetFilters sets tag filters.
    99  	SetFilters(value Filters) TagOptions
   100  
   101  	// Filters gets the tag filters.
   102  	Filters() Filters
   103  
   104  	// SetAllowTagNameDuplicates sets the value to allow duplicate tags to appear.
   105  	SetAllowTagNameDuplicates(value bool) TagOptions
   106  
   107  	// AllowTagNameDuplicates returns the value to allow duplicate tags to appear.
   108  	AllowTagNameDuplicates() bool
   109  
   110  	// SetAllowTagValueEmpty sets the value to allow empty tag values to appear.
   111  	SetAllowTagValueEmpty(value bool) TagOptions
   112  
   113  	// AllowTagValueEmpty returns the value to allow empty tag values to appear.
   114  	AllowTagValueEmpty() bool
   115  
   116  	// SetMaxTagLiteralLength sets the maximum length of a tag Name/Value.
   117  	SetMaxTagLiteralLength(value uint16) TagOptions
   118  
   119  	// MaxTagLiteralLength returns the maximum length of a tag Name/Value.
   120  	MaxTagLiteralLength() uint16
   121  
   122  	// Equals determines if two tag options are equivalent.
   123  	Equals(other TagOptions) bool
   124  }
   125  
   126  // Tags represents a set of tags with options.
   127  type Tags struct {
   128  	Opts     TagOptions
   129  	Tags     []Tag
   130  	hashedID uint64
   131  	id       []byte
   132  }
   133  
   134  // Tag is a key/value metric tag pair.
   135  type Tag struct {
   136  	Name  []byte
   137  	Value []byte
   138  }
   139  
   140  // Equal determiens whether two tags are equal to each other.
   141  func (t Tag) Equal(other Tag) bool {
   142  	return bytes.Equal(t.Name, other.Name) && bytes.Equal(t.Value, other.Value)
   143  }
   144  
   145  // MatchType is an enum for label matching types.
   146  type MatchType int
   147  
   148  // Possible MatchTypes.
   149  const (
   150  	MatchEqual MatchType = iota
   151  	MatchNotEqual
   152  	MatchRegexp
   153  	MatchNotRegexp
   154  	MatchField
   155  	MatchNotField
   156  	MatchAll
   157  )
   158  
   159  // Matcher models the matching of a label.
   160  // NB: when serialized to JSON, name and value will be in base64.
   161  type Matcher struct {
   162  	Type  MatchType `json:"type"`
   163  	Name  []byte    `json:"name"`
   164  	Value []byte    `json:"value"`
   165  
   166  	re *regexp.Regexp
   167  }
   168  
   169  // Matchers is a list of individual matchers.
   170  type Matchers []Matcher
   171  
   172  // Metric is the individual metric that gets returned from the search endpoint.
   173  type Metric struct {
   174  	ID   []byte
   175  	Tags Tags
   176  }
   177  
   178  // Metrics is a list of individual metrics.
   179  type Metrics []Metric
   180  
   181  // Filters is a set of tag filters.
   182  type Filters []Filter
   183  
   184  // Filter is a regex tag filter.
   185  type Filter struct {
   186  	// Name is the name of the series.
   187  	Name []byte
   188  	// Values are a set of filter values. If this is unset, all series containing
   189  	// the tag name are filtered.
   190  	Values [][]byte
   191  }