1// Copyright 2016 Circonus, Inc. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// CheckBundleMetrics API support - Fetch, Create*, Update, and Delete**
6// See: https://login.circonus.com/resources/api/calls/check_bundle_metrics
7// *  : create metrics by adding to array with a status of 'active'
8// ** : delete (distable collection of) metrics by changing status from 'active' to 'available'
9
10package api
11
12import (
13	"encoding/json"
14	"fmt"
15	"regexp"
16
17	"github.com/circonus-labs/circonus-gometrics/api/config"
18)
19
20// CheckBundleMetrics defines metrics for a specific check bundle. See https://login.circonus.com/resources/api/calls/check_bundle_metrics for more information.
21type CheckBundleMetrics struct {
22	CID     string              `json:"_cid,omitempty"` // string
23	Metrics []CheckBundleMetric `json:"metrics"`        // See check_bundle.go for CheckBundleMetric definition
24}
25
26// FetchCheckBundleMetrics retrieves metrics for the check bundle with passed cid.
27func (a *API) FetchCheckBundleMetrics(cid CIDType) (*CheckBundleMetrics, error) {
28	if cid == nil || *cid == "" {
29		return nil, fmt.Errorf("Invalid check bundle metrics CID [none]")
30	}
31
32	metricsCID := string(*cid)
33
34	matched, err := regexp.MatchString(config.CheckBundleMetricsCIDRegex, metricsCID)
35	if err != nil {
36		return nil, err
37	}
38	if !matched {
39		return nil, fmt.Errorf("Invalid check bundle metrics CID [%s]", metricsCID)
40	}
41
42	result, err := a.Get(metricsCID)
43	if err != nil {
44		return nil, err
45	}
46
47	if a.Debug {
48		a.Log.Printf("[DEBUG] fetch check bundle metrics, received JSON: %s", string(result))
49	}
50
51	metrics := &CheckBundleMetrics{}
52	if err := json.Unmarshal(result, metrics); err != nil {
53		return nil, err
54	}
55
56	return metrics, nil
57}
58
59// UpdateCheckBundleMetrics updates passed metrics.
60func (a *API) UpdateCheckBundleMetrics(cfg *CheckBundleMetrics) (*CheckBundleMetrics, error) {
61	if cfg == nil {
62		return nil, fmt.Errorf("Invalid check bundle metrics config [nil]")
63	}
64
65	metricsCID := string(cfg.CID)
66
67	matched, err := regexp.MatchString(config.CheckBundleMetricsCIDRegex, metricsCID)
68	if err != nil {
69		return nil, err
70	}
71	if !matched {
72		return nil, fmt.Errorf("Invalid check bundle metrics CID [%s]", metricsCID)
73	}
74
75	jsonCfg, err := json.Marshal(cfg)
76	if err != nil {
77		return nil, err
78	}
79
80	if a.Debug {
81		a.Log.Printf("[DEBUG] update check bundle metrics, sending JSON: %s", string(jsonCfg))
82	}
83
84	result, err := a.Put(metricsCID, jsonCfg)
85	if err != nil {
86		return nil, err
87	}
88
89	metrics := &CheckBundleMetrics{}
90	if err := json.Unmarshal(result, metrics); err != nil {
91		return nil, err
92	}
93
94	return metrics, nil
95}
96