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// Check API support - Fetch and Search 6// See: https://login.circonus.com/resources/api/calls/check 7// Notes: checks do not directly support create, update, and delete - see check bundle. 8 9package api 10 11import ( 12 "encoding/json" 13 "fmt" 14 "net/url" 15 "regexp" 16 17 "github.com/circonus-labs/circonus-gometrics/api/config" 18) 19 20// CheckDetails contains [undocumented] check type specific information 21type CheckDetails map[config.Key]string 22 23// Check defines a check. See https://login.circonus.com/resources/api/calls/check for more information. 24type Check struct { 25 Active bool `json:"_active"` // bool 26 BrokerCID string `json:"_broker"` // string 27 CheckBundleCID string `json:"_check_bundle"` // string 28 CheckUUID string `json:"_check_uuid"` // string 29 CID string `json:"_cid"` // string 30 Details CheckDetails `json:"_details"` // NOTE contents of details are check type specific, map len >= 0 31} 32 33// FetchCheck retrieves check with passed cid. 34func (a *API) FetchCheck(cid CIDType) (*Check, error) { 35 if cid == nil || *cid == "" { 36 return nil, fmt.Errorf("Invalid check CID [none]") 37 } 38 39 checkCID := string(*cid) 40 41 matched, err := regexp.MatchString(config.CheckCIDRegex, checkCID) 42 if err != nil { 43 return nil, err 44 } 45 if !matched { 46 return nil, fmt.Errorf("Invalid check CID [%s]", checkCID) 47 } 48 49 result, err := a.Get(checkCID) 50 if err != nil { 51 return nil, err 52 } 53 54 if a.Debug { 55 a.Log.Printf("[DEBUG] fetch check, received JSON: %s", string(result)) 56 } 57 58 check := new(Check) 59 if err := json.Unmarshal(result, check); err != nil { 60 return nil, err 61 } 62 63 return check, nil 64} 65 66// FetchChecks retrieves all checks available to the API Token. 67func (a *API) FetchChecks() (*[]Check, error) { 68 result, err := a.Get(config.CheckPrefix) 69 if err != nil { 70 return nil, err 71 } 72 73 var checks []Check 74 if err := json.Unmarshal(result, &checks); err != nil { 75 return nil, err 76 } 77 78 return &checks, nil 79} 80 81// SearchChecks returns checks matching the specified search query 82// and/or filter. If nil is passed for both parameters all checks 83// will be returned. 84func (a *API) SearchChecks(searchCriteria *SearchQueryType, filterCriteria *SearchFilterType) (*[]Check, error) { 85 q := url.Values{} 86 87 if searchCriteria != nil && *searchCriteria != "" { 88 q.Set("search", string(*searchCriteria)) 89 } 90 91 if filterCriteria != nil && len(*filterCriteria) > 0 { 92 for filter, criteria := range *filterCriteria { 93 for _, val := range criteria { 94 q.Add(filter, val) 95 } 96 } 97 } 98 99 if q.Encode() == "" { 100 return a.FetchChecks() 101 } 102 103 reqURL := url.URL{ 104 Path: config.CheckPrefix, 105 RawQuery: q.Encode(), 106 } 107 108 result, err := a.Get(reqURL.String()) 109 if err != nil { 110 return nil, err 111 } 112 113 var checks []Check 114 if err := json.Unmarshal(result, &checks); err != nil { 115 return nil, err 116 } 117 118 return &checks, nil 119} 120