func StartGCM()

in pkg/metrics/gcm.go [45:96]


func StartGCM(ctx context.Context, cfg common.Config) (*gcmProvider, error) {
	client, err := monitoring.NewMetricClient(ctx, option.WithUserAgent(common.UserAgent))
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}
	client.CallOptions = &monitoring.MetricCallOptions{
		CreateTimeSeries: []gax.CallOption{
			gax.WithRetry(func() gax.Retryer {
				return gax.OnCodes([]codes.Code{
					codes.DeadlineExceeded,
					codes.Unavailable,
				}, gax.Backoff{
					Initial:    time.Second,
					Max:        16 * time.Second,
					Multiplier: 2,
				})
			}),
		},
	}

	// Prepare metadata to specify the GCM "monitored resource"
	var resource *monitoredrespb.MonitoredResource
	if cfg.Mode == common.ModeCluster {
		resource = &monitoredrespb.MonitoredResource{
			Type: "k8s_cluster",
			Labels: map[string]string{
				"project_id":   cfg.ProjectID,
				"location":     cfg.Location,
				"cluster_name": cfg.Cluster,
			},
		}
	} else {
		resource = &monitoredrespb.MonitoredResource{
			Type: "k8s_node",
			Labels: map[string]string{
				"project_id":   cfg.ProjectID,
				"location":     cfg.Location,
				"cluster_name": cfg.Cluster,
				"node_name":    cfg.NodeName,
			},
		}
	}

	provider := &gcmProvider{
		// Prefer not to store context in a struct type, instead it should be passed as argument
		// ctx:      ctx,
		client:   client,
		project:  cfg.ProjectID,
		resource: resource,
	}
	return provider, err
}