textparse

package
v0.0.0-...-bec5d16 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 16, 2024 License: Apache-2.0 Imports: 19 Imported by: 0

README

Making changes to textparse lexers

In the rare case that you need to update the textparse lexers, edit promlex.l or openmetricslex.l and then run the following command: golex -o=promlex.l.go promlex.l

Note that you need golex installed: go get -u modernc.org/golex

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Entry

type Entry int

Entry represents the type of a parsed entry.

const (
	EntryInvalid   Entry = -1
	EntryType      Entry = 0
	EntryHelp      Entry = 1
	EntrySeries    Entry = 2 // A series with a simple float64 as value.
	EntryComment   Entry = 3
	EntryUnit      Entry = 4
	EntryHistogram Entry = 5 // A series with a native histogram as a value.
)

type OpenMetricsParser

type OpenMetricsParser struct {
	// contains filtered or unexported fields
}

OpenMetricsParser parses samples from a byte slice of samples in the official OpenMetrics text exposition format. This is based on the working draft https://docs.google.com/document/u/1/d/1KwV0mAXwwbvvifBvDKH_LU1YjyXE_wxCkHNoCGq1GX0/edit

func (*OpenMetricsParser) Comment

func (p *OpenMetricsParser) Comment() []byte

Comment returns the text of the current comment. Must only be called after Next returned a comment entry. The returned byte slice becomes invalid after the next call to Next.

func (*OpenMetricsParser) CreatedTimestamp

func (p *OpenMetricsParser) CreatedTimestamp() *int64

CreatedTimestamp returns nil as it's not implemented yet. TODO(bwplotka): https://github.com/emmalidtdg/prometheus/issues/12980

func (*OpenMetricsParser) Exemplar

func (p *OpenMetricsParser) Exemplar(e *exemplar.Exemplar) bool

Exemplar writes the exemplar of the current sample into the passed exemplar. It returns whether an exemplar exists. As OpenMetrics only ever has one exemplar per sample, every call after the first (for the same sample) will always return false.

func (*OpenMetricsParser) Help

func (p *OpenMetricsParser) Help() ([]byte, []byte)

Help returns the metric name and help text in the current entry. Must only be called after Next returned a help entry. The returned byte slices become invalid after the next call to Next.

func (*OpenMetricsParser) Histogram

Histogram returns (nil, nil, nil, nil) for now because OpenMetrics does not support sparse histograms yet.

func (*OpenMetricsParser) Metric

func (p *OpenMetricsParser) Metric(l *labels.Labels) string

Metric writes the labels of the current sample into the passed labels. It returns the string from which the metric was parsed.

func (*OpenMetricsParser) Next

func (p *OpenMetricsParser) Next() (Entry, error)

Next advances the parser to the next sample. It returns (EntryInvalid, io.EOF) if no samples were read.

func (*OpenMetricsParser) Series

func (p *OpenMetricsParser) Series() ([]byte, *int64, float64)

Series returns the bytes of the series, the timestamp if set, and the value of the current sample.

func (*OpenMetricsParser) Type

func (p *OpenMetricsParser) Type() ([]byte, model.MetricType)

Type returns the metric name and type in the current entry. Must only be called after Next returned a type entry. The returned byte slices become invalid after the next call to Next.

func (*OpenMetricsParser) Unit

func (p *OpenMetricsParser) Unit() ([]byte, []byte)

Unit returns the metric name and unit in the current entry. Must only be called after Next returned a unit entry. The returned byte slices become invalid after the next call to Next.

type Parser

type Parser interface {
	// Series returns the bytes of a series with a simple float64 as a
	// value, the timestamp if set, and the value of the current sample.
	Series() ([]byte, *int64, float64)

	// Histogram returns the bytes of a series with a sparse histogram as a
	// value, the timestamp if set, and the histogram in the current sample.
	// Depending on the parsed input, the function returns an (integer) Histogram
	// or a FloatHistogram, with the respective other return value being nil.
	Histogram() ([]byte, *int64, *histogram.Histogram, *histogram.FloatHistogram)

	// Help returns the metric name and help text in the current entry.
	// Must only be called after Next returned a help entry.
	// The returned byte slices become invalid after the next call to Next.
	Help() ([]byte, []byte)

	// Type returns the metric name and type in the current entry.
	// Must only be called after Next returned a type entry.
	// The returned byte slices become invalid after the next call to Next.
	Type() ([]byte, model.MetricType)

	// Unit returns the metric name and unit in the current entry.
	// Must only be called after Next returned a unit entry.
	// The returned byte slices become invalid after the next call to Next.
	Unit() ([]byte, []byte)

	// Comment returns the text of the current comment.
	// Must only be called after Next returned a comment entry.
	// The returned byte slice becomes invalid after the next call to Next.
	Comment() []byte

	// Metric writes the labels of the current sample into the passed labels.
	// It returns the string from which the metric was parsed.
	Metric(l *labels.Labels) string

	// Exemplar writes the exemplar of the current sample into the passed
	// exemplar. It can be called repeatedly to retrieve multiple exemplars
	// for the same sample. It returns false once all exemplars are
	// retrieved (including the case where no exemplars exist at all).
	Exemplar(l *exemplar.Exemplar) bool

	// CreatedTimestamp returns the created timestamp (in milliseconds) for the
	// current sample. It returns nil if it is unknown e.g. if it wasn't set,
	// if the scrape protocol or metric type does not support created timestamps.
	CreatedTimestamp() *int64

	// Next advances the parser to the next sample.
	// It returns (EntryInvalid, io.EOF) if no samples were read.
	Next() (Entry, error)
}

Parser parses samples from a byte slice of samples in the official Prometheus and OpenMetrics text exposition formats.

func New

func New(b []byte, contentType string, parseClassicHistograms bool, st *labels.SymbolTable) (Parser, error)

New returns a new parser of the byte slice.

This function always returns a valid parser, but might additionally return an error if the content type cannot be parsed.

func NewOpenMetricsParser

func NewOpenMetricsParser(b []byte, st *labels.SymbolTable) Parser

NewOpenMetricsParser returns a new parser of the byte slice.

func NewPromParser

func NewPromParser(b []byte, st *labels.SymbolTable) Parser

NewPromParser returns a new parser of the byte slice.

func NewProtobufParser

func NewProtobufParser(b []byte, parseClassicHistograms bool, st *labels.SymbolTable) Parser

NewProtobufParser returns a parser for the payload in the byte slice.

type PromParser

type PromParser struct {
	// contains filtered or unexported fields
}

PromParser parses samples from a byte slice of samples in the official Prometheus text exposition format.

func (*PromParser) Comment

func (p *PromParser) Comment() []byte

Comment returns the text of the current comment. Must only be called after Next returned a comment entry. The returned byte slice becomes invalid after the next call to Next.

func (*PromParser) CreatedTimestamp

func (p *PromParser) CreatedTimestamp() *int64

CreatedTimestamp returns nil as it's not implemented yet. TODO(bwplotka): https://github.com/emmalidtdg/prometheus/issues/12980

func (*PromParser) Exemplar

func (p *PromParser) Exemplar(*exemplar.Exemplar) bool

Exemplar implements the Parser interface. However, since the classic Prometheus text format does not support exemplars, this implementation simply returns false and does nothing else.

func (*PromParser) Help

func (p *PromParser) Help() ([]byte, []byte)

Help returns the metric name and help text in the current entry. Must only be called after Next returned a help entry. The returned byte slices become invalid after the next call to Next.

func (*PromParser) Histogram

func (p *PromParser) Histogram() ([]byte, *int64, *histogram.Histogram, *histogram.FloatHistogram)

Histogram returns (nil, nil, nil, nil) for now because the Prometheus text format does not support sparse histograms yet.

func (*PromParser) Metric

func (p *PromParser) Metric(l *labels.Labels) string

Metric writes the labels of the current sample into the passed labels. It returns the string from which the metric was parsed.

func (*PromParser) Next

func (p *PromParser) Next() (Entry, error)

Next advances the parser to the next sample. It returns (EntryInvalid, io.EOF) if no samples were read.

func (*PromParser) Series

func (p *PromParser) Series() ([]byte, *int64, float64)

Series returns the bytes of the series, the timestamp if set, and the value of the current sample.

func (*PromParser) Type

func (p *PromParser) Type() ([]byte, model.MetricType)

Type returns the metric name and type in the current entry. Must only be called after Next returned a type entry. The returned byte slices become invalid after the next call to Next.

func (*PromParser) Unit

func (p *PromParser) Unit() ([]byte, []byte)

Unit returns the metric name and unit in the current entry. Must only be called after Next returned a unit entry. The returned byte slices become invalid after the next call to Next.

type ProtobufParser

type ProtobufParser struct {
	// contains filtered or unexported fields
}

ProtobufParser is a very inefficient way of unmarshaling the old Prometheus protobuf format and then present it as it if were parsed by a Prometheus-2-style text parser. This is only done so that we can easily plug in the protobuf format into Prometheus 2. For future use (with the final format that will be used for native histograms), we have to revisit the parsing. A lot of the efficiency tricks of the Prometheus-2-style parsing could be used in a similar fashion (byte-slice pointers into the raw payload), which requires some hand-coded protobuf handling. But the current parsers all expect the full series name (metric name plus label pairs) as one string, which is not how things are represented in the protobuf format. If the re-arrangement work is actually causing problems (which has to be seen), that expectation needs to be changed.

func (*ProtobufParser) Comment

func (p *ProtobufParser) Comment() []byte

Comment always returns nil because comments aren't supported by the protobuf format.

func (*ProtobufParser) CreatedTimestamp

func (p *ProtobufParser) CreatedTimestamp() *int64

CreatedTimestamp returns CT or nil if CT is not present or invalid (as timestamp e.g. negative value) on counters, summaries or histograms.

func (*ProtobufParser) Exemplar

func (p *ProtobufParser) Exemplar(ex *exemplar.Exemplar) bool

Exemplar writes the exemplar of the current sample into the passed exemplar. It returns if an exemplar exists or not. In case of a native histogram, the exemplars in the native histogram will be returned. If this field is empty, the classic bucket section is still used for exemplars. To ingest all exemplars, call the Exemplar method repeatedly until it returns false.

func (*ProtobufParser) Help

func (p *ProtobufParser) Help() ([]byte, []byte)

Help returns the metric name and help text in the current entry. Must only be called after Next returned a help entry. The returned byte slices become invalid after the next call to Next.

func (*ProtobufParser) Histogram

Histogram returns the bytes of a series with a native histogram as a value, the timestamp if set, and the native histogram in the current sample.

The Compact method is called before returning the Histogram (or FloatHistogram).

If the SampleCountFloat or the ZeroCountFloat in the proto message is > 0, the histogram is parsed and returned as a FloatHistogram and nil is returned as the (integer) Histogram return value. Otherwise, it is parsed and returned as an (integer) Histogram and nil is returned as the FloatHistogram return value.

func (*ProtobufParser) Metric

func (p *ProtobufParser) Metric(l *labels.Labels) string

Metric writes the labels of the current sample into the passed labels. It returns the string from which the metric was parsed.

func (*ProtobufParser) Next

func (p *ProtobufParser) Next() (Entry, error)

Next advances the parser to the next "sample" (emulating the behavior of a text format parser). It returns (EntryInvalid, io.EOF) if no samples were read.

func (*ProtobufParser) Series

func (p *ProtobufParser) Series() ([]byte, *int64, float64)

Series returns the bytes of a series with a simple float64 as a value, the timestamp if set, and the value of the current sample.

func (*ProtobufParser) Type

func (p *ProtobufParser) Type() ([]byte, model.MetricType)

Type returns the metric name and type in the current entry. Must only be called after Next returned a type entry. The returned byte slices become invalid after the next call to Next.

func (*ProtobufParser) Unit

func (p *ProtobufParser) Unit() ([]byte, []byte)

Unit returns the metric unit in the current entry. Must only be called after Next returned a unit entry. The returned byte slices become invalid after the next call to Next.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL