--- /dev/null
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package wire
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+type ExportMetricsServiceRequest struct {
+ Node *Node `json:"node,omitempty"`
+ Metrics []*Metric `json:"metrics,omitempty"`
+ Resource *Resource `json:"resource,omitempty"`
+}
+
+type Metric struct {
+ MetricDescriptor *MetricDescriptor `json:"metric_descriptor,omitempty"`
+ Timeseries []*TimeSeries `json:"timeseries,omitempty"`
+ Resource *Resource `json:"resource,omitempty"`
+}
+
+type MetricDescriptor struct {
+ Name string `json:"name,omitempty"`
+ Description string `json:"description,omitempty"`
+ Unit string `json:"unit,omitempty"`
+ Type MetricDescriptor_Type `json:"type,omitempty"`
+ LabelKeys []*LabelKey `json:"label_keys,omitempty"`
+}
+
+type MetricDescriptor_Type int32
+
+const (
+ MetricDescriptor_UNSPECIFIED MetricDescriptor_Type = 0
+ MetricDescriptor_GAUGE_INT64 MetricDescriptor_Type = 1
+ MetricDescriptor_GAUGE_DOUBLE MetricDescriptor_Type = 2
+ MetricDescriptor_GAUGE_DISTRIBUTION MetricDescriptor_Type = 3
+ MetricDescriptor_CUMULATIVE_INT64 MetricDescriptor_Type = 4
+ MetricDescriptor_CUMULATIVE_DOUBLE MetricDescriptor_Type = 5
+ MetricDescriptor_CUMULATIVE_DISTRIBUTION MetricDescriptor_Type = 6
+ MetricDescriptor_SUMMARY MetricDescriptor_Type = 7
+)
+
+type LabelKey struct {
+ Key string `json:"key,omitempty"`
+ Description string `json:"description,omitempty"`
+}
+
+type TimeSeries struct {
+ StartTimestamp *Timestamp `json:"start_timestamp,omitempty"`
+ LabelValues []*LabelValue `json:"label_values,omitempty"`
+ Points []*Point `json:"points,omitempty"`
+}
+
+type LabelValue struct {
+ Value string `json:"value,omitempty"`
+ HasValue bool `json:"has_value,omitempty"`
+}
+
+type Point struct {
+ Timestamp *Timestamp `json:"timestamp,omitempty"`
+ Value PointValue `json:"value,omitempty"`
+}
+
+type PointInt64Value struct {
+ Int64Value int64 `json:"int64Value,omitempty"`
+}
+
+// MarshalJSON creates JSON formatted the same way as jsonpb so that the
+// OpenCensus service can correctly determine the underlying value type.
+// This custom MarshalJSON exists because,
+// by default *Point is JSON marshalled as:
+// {"value": {"int64Value": 1}}
+// but it should be marshalled as:
+// {"int64Value": 1}
+func (p *Point) MarshalJSON() ([]byte, error) {
+ if p == nil {
+ return []byte("null"), nil
+ }
+
+ switch d := p.Value.(type) {
+ case PointInt64Value:
+ return json.Marshal(&struct {
+ Timestamp *Timestamp `json:"timestamp,omitempty"`
+ Value int64 `json:"int64Value,omitempty"`
+ }{
+ Timestamp: p.Timestamp,
+ Value: d.Int64Value,
+ })
+ case PointDoubleValue:
+ return json.Marshal(&struct {
+ Timestamp *Timestamp `json:"timestamp,omitempty"`
+ Value float64 `json:"doubleValue,omitempty"`
+ }{
+ Timestamp: p.Timestamp,
+ Value: d.DoubleValue,
+ })
+ case PointDistributionValue:
+ return json.Marshal(&struct {
+ Timestamp *Timestamp `json:"timestamp,omitempty"`
+ Value *DistributionValue `json:"distributionValue,omitempty"`
+ }{
+ Timestamp: p.Timestamp,
+ Value: d.DistributionValue,
+ })
+ default:
+ return nil, fmt.Errorf("unknown point type %T", p.Value)
+ }
+}
+
+type PointDoubleValue struct {
+ DoubleValue float64 `json:"doubleValue,omitempty"`
+}
+
+type PointDistributionValue struct {
+ DistributionValue *DistributionValue `json:"distributionValue,omitempty"`
+}
+
+type PointSummaryValue struct {
+ SummaryValue *SummaryValue `json:"summaryValue,omitempty"`
+}
+
+type PointValue interface {
+ labelPointValue()
+}
+
+func (PointInt64Value) labelPointValue() {}
+func (PointDoubleValue) labelPointValue() {}
+func (PointDistributionValue) labelPointValue() {}
+func (PointSummaryValue) labelPointValue() {}
+
+type DistributionValue struct {
+ Count int64 `json:"count,omitempty"`
+ Sum float64 `json:"sum,omitempty"`
+ SumOfSquaredDeviation float64 `json:"sum_of_squared_deviation,omitempty"`
+ BucketOptions BucketOptions `json:"bucket_options,omitempty"`
+ Buckets []*Bucket `json:"buckets,omitempty"`
+}
+
+type BucketOptionsExplicit struct {
+ Bounds []float64 `json:"bounds,omitempty"`
+}
+
+type BucketOptions interface {
+ labelBucketOptions()
+}
+
+func (*BucketOptionsExplicit) labelBucketOptions() {}
+
+var _ BucketOptions = (*BucketOptionsExplicit)(nil)
+var _ json.Marshaler = (*BucketOptionsExplicit)(nil)
+
+// Declared for the purpose of custom JSON marshaling without cycles.
+type bucketOptionsExplicitAlias BucketOptionsExplicit
+
+// MarshalJSON creates JSON formatted the same way as jsonpb so that the
+// OpenCensus service can correctly determine the underlying value type.
+// This custom MarshalJSON exists because,
+// by default BucketOptionsExplicit is JSON marshalled as:
+// {"bounds":[1,2,3]}
+// but it should be marshalled as:
+// {"explicit":{"bounds":[1,2,3]}}
+func (be *BucketOptionsExplicit) MarshalJSON() ([]byte, error) {
+ return json.Marshal(&struct {
+ Explicit *bucketOptionsExplicitAlias `json:"explicit,omitempty"`
+ }{
+ Explicit: (*bucketOptionsExplicitAlias)(be),
+ })
+}
+
+type Bucket struct {
+ Count int64 `json:"count,omitempty"`
+ Exemplar *Exemplar `json:"exemplar,omitempty"`
+}
+
+type Exemplar struct {
+ Value float64 `json:"value,omitempty"`
+ Timestamp *Timestamp `json:"timestamp,omitempty"`
+ Attachments map[string]string `json:"attachments,omitempty"`
+}
+
+type SummaryValue struct {
+ Count *Int64Value `json:"count,omitempty"`
+ Sum *DoubleValue `json:"sum,omitempty"`
+ Snapshot *Snapshot `json:"snapshot,omitempty"`
+}
+
+type Snapshot struct {
+ Count *Int64Value `json:"count,omitempty"`
+ Sum *DoubleValue `json:"sum,omitempty"`
+ PercentileValues []*SnapshotValueAtPercentile `json:"percentile_values,omitempty"`
+}
+
+type SnapshotValueAtPercentile struct {
+ Percentile float64 `json:"percentile,omitempty"`
+ Value float64 `json:"value,omitempty"`
+}