sharedlibraries/timeseries/timeseries.go (123 lines of code) (raw):
/*
Copyright 2022 Google LLC
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
https://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.
*/
// Package timeseries has cloud monitoring timeseries related helper functions.
package timeseries
import (
mpb "google.golang.org/genproto/googleapis/api/metric"
mrespb "google.golang.org/genproto/googleapis/api/monitoredres"
cpb "google.golang.org/genproto/googleapis/monitoring/v3"
mrpb "google.golang.org/genproto/googleapis/monitoring/v3"
tpb "google.golang.org/protobuf/types/known/timestamppb"
"github.com/GoogleCloudPlatform/workloadagentplatform/sharedlibraries/gce/metadataserver"
)
// Params has the necessary data to create a timeseries points.
type Params struct {
BareMetal bool
Heartbeat bool
ResourceLabels map[string]string
CloudProp *metadataserver.CloudProperties
MetricType string
MetricLabels map[string]string
MetricKind mpb.MetricDescriptor_MetricKind
StartTime *tpb.Timestamp
Timestamp *tpb.Timestamp
Int64Value int64
Float64Value float64
BoolValue bool
}
// BuildInt builds a cloud monitoring timeseries with Int64 point.
func BuildInt(p Params) *mrpb.TimeSeries {
ts := buildTimeSeries(p)
if p.StartTime == nil {
p.StartTime = p.Timestamp
}
ts.Points = []*mrpb.Point{{
Interval: &cpb.TimeInterval{
StartTime: p.StartTime,
EndTime: p.Timestamp,
},
Value: &cpb.TypedValue{
Value: &cpb.TypedValue_Int64Value{
Int64Value: p.Int64Value,
},
},
}}
return ts
}
// BuildBool builds a cloud monitoring timeseries with boolean point.
func BuildBool(p Params) *mrpb.TimeSeries {
ts := buildTimeSeries(p)
if p.StartTime == nil {
p.StartTime = p.Timestamp
}
ts.Points = []*mrpb.Point{{
Interval: &cpb.TimeInterval{
StartTime: p.StartTime,
EndTime: p.Timestamp,
},
Value: &cpb.TypedValue{
Value: &cpb.TypedValue_BoolValue{
BoolValue: p.BoolValue,
},
},
}}
return ts
}
// BuildFloat64 builds a cloud monitoring timeseries with float64 point.
func BuildFloat64(p Params) *mrpb.TimeSeries {
ts := buildTimeSeries(p)
if p.StartTime == nil {
p.StartTime = p.Timestamp
}
ts.Points = []*mrpb.Point{{
Interval: &cpb.TimeInterval{
StartTime: p.StartTime,
EndTime: p.Timestamp,
},
Value: &cpb.TypedValue{
Value: &cpb.TypedValue_DoubleValue{
DoubleValue: p.Float64Value,
},
},
}}
return ts
}
func buildTimeSeries(p Params) *mrpb.TimeSeries {
if p.MetricKind == mpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED {
p.MetricKind = mpb.MetricDescriptor_GAUGE
}
return &mrpb.TimeSeries{
Metric: &mpb.Metric{
Type: p.MetricType,
Labels: p.MetricLabels,
},
MetricKind: p.MetricKind,
Resource: monitoredResource(p.CloudProp, p.BareMetal, p.Heartbeat, p.ResourceLabels),
}
}
func monitoredResource(cp *metadataserver.CloudProperties, bareMetal bool, hearbeat bool, resourceLabels map[string]string) *mrespb.MonitoredResource {
switch {
case bareMetal && hearbeat: // Hearbeat metrics for bare metal.
return &mrespb.MonitoredResource{
Type: "compute.googleapis.com/WorkloadProcess",
Labels: resourceLabels,
}
case bareMetal: // Regular custom metrics for bare metal.
return &mrespb.MonitoredResource{
Type: "generic_node",
Labels: map[string]string{
"project_id": cp.ProjectID,
"location": cp.Region,
"namespace": cp.InstanceName,
"node_id": cp.InstanceName,
},
}
case hearbeat: // Hearbeat metrics for GCE.
return &mrespb.MonitoredResource{
Type: "compute.googleapis.com/WorkloadProcess",
Labels: resourceLabels,
}
default: // Regular custom metrics for GCE.
return &mrespb.MonitoredResource{
Type: "gce_instance",
Labels: map[string]string{
"project_id": cp.ProjectID,
"zone": cp.Zone,
"instance_id": cp.InstanceID,
},
}
}
}