11package collector
22
33import (
4+ "fmt"
45 "github.com/go-kit/log"
6+ "github.com/go-kit/log/level"
57 "github.com/tencentyun/tencentcloud-exporter/pkg/common"
8+ "github.com/tencentyun/tencentcloud-exporter/pkg/instance"
69 "github.com/tencentyun/tencentcloud-exporter/pkg/metric"
10+ "github.com/tencentyun/tencentcloud-exporter/pkg/util"
711)
812
913const (
@@ -17,6 +21,7 @@ func init() {
1721
1822type cbsHandler struct {
1923 baseProductHandler
24+ instanceInfosRepo instance.CbsTcInstanceInfosRepository
2025}
2126
2227func (h * cbsHandler ) IsMetricMetaVaild (meta * metric.TcmMeta ) bool {
@@ -31,13 +36,188 @@ func (h *cbsHandler) IsMetricVaild(m *metric.TcmMetric) bool {
3136 return true
3237}
3338
39+ func (h * cbsHandler ) GetSeries (m * metric.TcmMetric ) ([]* metric.TcmSeries , error ) {
40+ if m .Conf .IsIncludeOnlyInstance () {
41+ return h .GetSeriesByOnly (m )
42+ }
43+
44+ if m .Conf .IsIncludeAllInstance () {
45+ return h .GetSeriesByAll (m )
46+ }
47+
48+ if m .Conf .IsCustomQueryDimensions () {
49+ return h .GetSeriesByCustom (m )
50+ }
51+
52+ return nil , fmt .Errorf ("must config all_instances or only_include_instances or custom_query_dimensions" )
53+ }
54+
55+ func (h * cbsHandler ) GetSeriesByOnly (m * metric.TcmMetric ) ([]* metric.TcmSeries , error ) {
56+ var slist []* metric.TcmSeries
57+ var dimensions []string
58+ for _ , v := range m .Meta .SupportDimensions {
59+ dimensions = append (dimensions , v )
60+ }
61+ if util .IsStrInList (dimensions , "unInstanceId" ) {
62+ for _ , insId := range m .Conf .OnlyIncludeInstances {
63+ cvmIds , err := h .instanceInfosRepo .Get (insId )
64+ if err != nil || len (cvmIds ) == 0 {
65+ level .Error (h .logger ).Log ("msg" , "Instance not found" , "id" , insId )
66+ continue
67+ }
68+ sl , err := h .getSeriesByMetricType (m , nil , cvmIds )
69+ if err != nil {
70+ level .Error (h .logger ).Log ("msg" , "Create metric series fail" ,
71+ "metric" , m .Meta .MetricName , "instacne" , cvmIds )
72+ continue
73+ }
74+ slist = append (slist , sl ... )
75+ }
76+ } else {
77+ for _ , insId := range m .Conf .OnlyIncludeInstances {
78+ ins , err := h .collector .InstanceRepo .Get (insId )
79+ if err != nil {
80+ level .Error (h .logger ).Log ("msg" , "Instance not found" , "id" , insId )
81+ continue
82+ }
83+
84+ sl , err := h .getSeriesByMetricType (m , ins , nil )
85+ if err != nil {
86+ level .Error (h .logger ).Log ("msg" , "Create metric series fail" ,
87+ "metric" , m .Meta .MetricName , "instacne" , ins .GetInstanceId ())
88+ continue
89+ }
90+ slist = append (slist , sl ... )
91+ }
92+ }
93+
94+ return slist , nil
95+ }
96+
97+ func (h * cbsHandler ) GetSeriesByAll (m * metric.TcmMetric ) ([]* metric.TcmSeries , error ) {
98+ var slist []* metric.TcmSeries
99+ var dimensions []string
100+ for _ , v := range m .Meta .SupportDimensions {
101+ dimensions = append (dimensions , v )
102+ }
103+ if util .IsStrInList (dimensions , "unInstanceId" ) {
104+ sl , err := h .getSeriesByMetricType (m , nil , nil )
105+ if err != nil {
106+ level .Error (h .logger ).Log ("msg" , "Create metric series fail" ,
107+ "metric" , m .Meta .MetricName , "instacne" )
108+ }
109+ slist = append (slist , sl ... )
110+ } else {
111+ insList , err := h .collector .InstanceRepo .ListByFilters (m .Conf .InstanceFilters )
112+ // cvmIds, err := h.instanceInfosRepo.ListByFilters(m.Conf.InstanceFilters)
113+ if err != nil {
114+ return nil , err
115+ }
116+ for _ , ins := range insList {
117+ if len (m .Conf .ExcludeInstances ) != 0 && util .IsStrInList (m .Conf .ExcludeInstances , ins .GetInstanceId ()) {
118+ continue
119+ }
120+ sl , err := h .getSeriesByMetricType (m , ins , nil )
121+ if err != nil {
122+ level .Error (h .logger ).Log ("msg" , "Create metric series fail" ,
123+ "metric" , m .Meta .MetricName , "instacne" , ins .GetInstanceId ())
124+ continue
125+ }
126+ slist = append (slist , sl ... )
127+ }
128+ }
129+
130+ return slist , nil
131+ }
132+
133+ func (h * cbsHandler ) GetSeriesByCustom (m * metric.TcmMetric ) ([]* metric.TcmSeries , error ) {
134+ var slist []* metric.TcmSeries
135+ for _ , ql := range m .Conf .CustomQueryDimensions {
136+ v , ok := ql [h .monitorQueryKey ]
137+ if ! ok {
138+ level .Error (h .logger ).Log (
139+ "msg" , fmt .Sprintf ("not found %s in queryDimensions" , h .monitorQueryKey ),
140+ "ql" , fmt .Sprintf ("%v" , ql ))
141+ continue
142+ }
143+ ins , err := h .collector .InstanceRepo .Get (v )
144+ if err != nil {
145+ level .Error (h .logger ).Log ("msg" , "Instance not found" , "err" , err , "id" , v )
146+ continue
147+ }
148+
149+ sl , err := h .getSeriesByMetricType (m , ins , nil )
150+ if err != nil {
151+ level .Error (h .logger ).Log ("msg" , "Create metric series fail" ,
152+ "metric" , m .Meta .MetricName , "instacne" , ins .GetInstanceId ())
153+ continue
154+ }
155+ slist = append (slist , sl ... )
156+ }
157+ return slist , nil
158+ }
159+
160+ func (h * cbsHandler ) getSeriesByMetricType (m * metric.TcmMetric , ins instance.TcInstance , ids []string ) ([]* metric.TcmSeries , error ) {
161+ var dimensions []string
162+ for _ , v := range m .Meta .SupportDimensions {
163+ dimensions = append (dimensions , v )
164+ }
165+ if util .IsStrInList (dimensions , "unInstanceId" ) {
166+ return h .getInstanceSeries (m , ins , ids )
167+ } else {
168+ return h .getCbsSeries (m , ins )
169+ }
170+ }
171+
172+ func (h * cbsHandler ) getCbsSeries (m * metric.TcmMetric , ins instance.TcInstance ) ([]* metric.TcmSeries , error ) {
173+ var series []* metric.TcmSeries
174+
175+ ql := map [string ]string {
176+ h .monitorQueryKey : ins .GetMonitorQueryKey (),
177+ }
178+ s , err := metric .NewTcmSeries (m , ql , ins )
179+ if err != nil {
180+ return nil , err
181+ }
182+ series = append (series , s )
183+
184+ return series , nil
185+ }
186+
187+ func (h * cbsHandler ) getInstanceSeries (m * metric.TcmMetric , ins instance.TcInstance , ids []string ) ([]* metric.TcmSeries , error ) {
188+ var series []* metric.TcmSeries
189+ instanceInfos , err := h .instanceInfosRepo .GetInstanceInfosInfoByFilters (ids )
190+ if err != nil {
191+ return nil , err
192+ }
193+ for _ , instanceInfo := range instanceInfos .Response .InstanceSet {
194+
195+ ql := map [string ]string {
196+ "InstanceId" : * instanceInfo .InstanceId ,
197+ }
198+ s , err := metric .NewTcmSeries (m , ql , ins )
199+ if err != nil {
200+ return nil , err
201+ }
202+ series = append (series , s )
203+ }
204+
205+ return series , nil
206+ }
207+
34208func NewCbsHandler (cred common.CredentialIface , c * TcProductCollector , logger log.Logger ) (handler ProductHandler , err error ) {
209+ instanceInfosRepoCahe , err := instance .NewCbsTcInstanceInfosRepository (cred , c .Conf , logger )
210+ if err != nil {
211+ return nil , err
212+ }
213+
35214 handler = & cbsHandler {
36- baseProductHandler {
215+ baseProductHandler : baseProductHandler {
37216 monitorQueryKey : CbsInstanceidKey ,
38217 collector : c ,
39218 logger : logger ,
40219 },
220+ instanceInfosRepo : instanceInfosRepoCahe ,
41221 }
42222 return
43223
0 commit comments