diff --git a/proto/Makefile b/proto/Makefile new file mode 100644 index 0000000..bce6ddf --- /dev/null +++ b/proto/Makefile @@ -0,0 +1,7 @@ +# NB(rob): Move this to top level Makefile once merged to master, +# then can add a rule to CircleCI to build the protobuf to make sure +# it is valid. +%.pb.go: %.proto + protoc --go_out=. $< + +all: $(patsubst %.proto,%.pb.go,$(wildcard *.proto)) diff --git a/proto/openmetrics_data_model.proto b/proto/openmetrics_data_model.proto new file mode 100644 index 0000000..f4d7e5f --- /dev/null +++ b/proto/openmetrics_data_model.proto @@ -0,0 +1,214 @@ +syntax = "proto3"; + +// The OpenMetrics protobuf schema which defines the protobuf wire format. +// Ensure to interpret "required" as semantically required for a valid message. +// All string fields MUST be UTF-8 encoded strings. +package openmetrics; + +import "google/protobuf/timestamp.proto"; + +// The top-level container type that is encoded and sent over the wire. +message MetricSet { + // Each MetricPoints has one or more points for a single metric. + repeated MetricFamily metric_families = 1; +} + +// One or more metrics for a single metric family, where each metric +// has one or more points. +message MetricFamily { + // Required. + string name = 1; + + // Optional. + MetricType type = 2; + + // Optional. + string unit = 3; + + // Optional. + string help = 4; + + // Optional. + repeated Metric metrics = 5; +} + +// The type of a metric. +enum MetricType { + // Unknown must use unknown point values. + UNKNOWN = 0; + // Gauge must use gauge point values. + GAUGE = 1; + // Counter must use counter point values. + COUNTER = 2; + // State set must use state set value points. + STATE_SET = 3; + // Info must use info value points. + INFO = 4; + // Histogram must use histogram value points. + HISTOGRAM = 5; + // Gauge histogram must use histogram value points. + GAUGE_HISTOGRAM = 6; + // Summary quantiles must use summary value points. + SUMMARY = 7; +} + +// A single metric with a unique set of labels within a metric family. +message Metric { + // Optional. + repeated Label labels = 1; + + // Optional. + repeated Point points = 2; +} + +// A name-value pair. These are used in multiple places: identifying +// timeseries, value of INFO metrics, and exemplars in Histograms. +message Label { + // Required. + string name = 1; + + // Required. + string value = 2; +} + +// A point in a metric. +message Point { + // Required. + oneof value { + UnknownValue unknown_value = 1; + GaugeValue gauge_value = 2; + CounterValue counter_value = 3; + HistogramValue histogram_value = 4; + StateSetValue state_set_value = 5; + InfoValue info_value = 6; + SummaryValue summary_value = 7; + } + + // Optional. + google.protobuf.Timestamp timestamp = 8; +} + +// Value for UNKNOWN point. +message UnknownValue { + // Required. + oneof value { + double double_value = 1; + int64 int_value = 2; + } +} + +// Value for GAUGE point. +message GaugeValue { + // Required. + oneof value { + double double_value = 1; + int64 int_value = 2; + } +} + +// Value for COUNTER point. +message CounterValue { + // Required. + oneof total { + double double_value = 1; + uint64 int_value = 2; + } + + // The time values began being collected for this counter. + // Optional. + google.protobuf.Timestamp created = 3; + + // Optional. + Exemplar exemplar = 4; +} + +// Value for HISTOGRAM or GAUGE_HISTOGRAM point. +message HistogramValue { + // Optional. + oneof sum { + double double_value = 1; + int64 int_value = 2; + } + + // Optional. + uint64 count = 3; + + // The time values began being collected for this histogram. + // Optional. + google.protobuf.Timestamp created = 4; + + // Optional. + repeated Bucket buckets = 5; + + // Bucket is the number of values for a bucket in the histogram + // with an optional exemplar. + message Bucket { + // Required. + uint64 count = 1; + + // Optional. + double upper_bound = 2; + + // Optional. + Exemplar exemplar = 3; + } +} + +message Exemplar { + // Required. + double value = 1; + + // Optional. + google.protobuf.Timestamp timestamp = 2; + + // Labels are additional information about the exemplar value (e.g. trace id). + // Optional. + repeated Label label = 3; +} + +// Value for STATE_SET point. +message StateSetValue { + // Optional. + repeated State states = 1; + + message State { + // Required. + bool enabled = 1; + + // Required. + string name = 2; + } +} + +// Value for INFO point. +message InfoValue { + // Optional. + repeated Label info = 1; +} + +// Value for SUMMARY point. +message SummaryValue { + // Optional. + oneof sum { + double double_value = 1; + int64 int_value = 2; + } + + // Optional. + uint64 count = 2; + + // The time sum and count values began being collected for this summary. + // Optional. + google.protobuf.Timestamp created = 3; + + // Optional. + repeated Quantile quantile = 4; + + message Quantile { + // Required. + double quantile = 1; + + // Required. + double value = 2; + } +}