@@ -10,13 +10,31 @@ import (
1010 "github.com/tencentyun/tencentcloud-exporter/pkg/util"
1111)
1212
13+ type SeriesCache struct {
14+ Series map [string ]* TcmSeries // 包含的多个时间线
15+ // need cache it, because some cases DescribeBaseMetrics/GetMonitorData dims not match
16+ LabelNames map [string ]struct {}
17+ }
18+
19+ func newCache () * SeriesCache {
20+ return & SeriesCache {
21+ Series : make (map [string ]* TcmSeries ),
22+ LabelNames : make (map [string ]struct {}),
23+ }
24+ }
25+
26+ type Desc struct {
27+ FQName string
28+ Help string
29+ }
30+
1331// 代表一个指标, 包含多个时间线
1432type TcmMetric struct {
1533 Id string
16- Meta * TcmMeta // 指标元数据
17- Labels * TcmLabels // 指标labels
18- Series map [ string ] * TcmSeries // 包含的多个时间线
19- StatPromDesc map [string ]* prometheus. Desc // 按统计纬度的Desc, max、min、avg、last
34+ Meta * TcmMeta // 指标元数据
35+ Labels * TcmLabels // 指标labels
36+ SeriesCache * SeriesCache
37+ StatPromDesc map [string ]Desc // 按统计纬度的Desc, max、min、avg、last
2038 Conf * TcmMetricConfig
2139 seriesLock sync.Mutex
2240}
@@ -25,11 +43,16 @@ func (m *TcmMetric) LoadSeries(series []*TcmSeries) error {
2543 m .seriesLock .Lock ()
2644 defer m .seriesLock .Unlock ()
2745
28- newSeries := make (map [string ]* TcmSeries )
46+ newSeriesCache := newCache ()
47+
2948 for _ , s := range series {
30- newSeries [s .Id ] = s
49+ newSeriesCache .Series [s .Id ] = s
50+ // add label names
51+ for key , _ := range s .QueryLabels {
52+ newSeriesCache .LabelNames [key ] = struct {}{}
53+ }
3154 }
32- m .Series = newSeries
55+ m .SeriesCache = newSeriesCache
3356 return nil
3457}
3558
@@ -73,21 +96,34 @@ func (m *TcmMetric) GetLatestPromMetrics(repo TcmMetricRepository) (pms []promet
7396 return nil , err
7497 }
7598 }
76- values , err := m .Labels .GetValues (samples .Series .QueryLabels , samples .Series .Instance )
77- if err != nil {
78- return nil , err
99+ labels := m .Labels .GetValues (samples .Series .QueryLabels , samples .Series .Instance )
100+ // add all dimensions from cloud monitor into prom labels
101+ for _ , dim := range point .Dimensions {
102+ labels [* dim .Name ] = * dim .Value
79103 }
104+ var names []string
105+ var values []string
106+ for k , v := range labels {
107+ names = append (names , util .ToUnderlineLower (k ))
108+ values = append (values , v )
109+ }
110+ newDesc := prometheus .NewDesc (
111+ desc .FQName ,
112+ desc .Help ,
113+ names ,
114+ nil ,
115+ )
80116 var pm prometheus.Metric
81117 if m .Conf .StatDelaySeconds > 0 {
82118 pm = prometheus .NewMetricWithTimestamp (time .Unix (int64 (point .Timestamp ), 0 ), prometheus .MustNewConstMetric (
83- desc ,
119+ newDesc ,
84120 prometheus .GaugeValue ,
85121 point .Value ,
86122 values ... ,
87123 ))
88124 } else {
89125 pm = prometheus .MustNewConstMetric (
90- desc ,
126+ newDesc ,
91127 prometheus .GaugeValue ,
92128 point .Value ,
93129 values ... ,
@@ -102,7 +138,7 @@ func (m *TcmMetric) GetLatestPromMetrics(repo TcmMetricRepository) (pms []promet
102138
103139func (m * TcmMetric ) GetSeriesSplitByBatch (batch int ) (steps [][]* TcmSeries ) {
104140 var series []* TcmSeries
105- for _ , s := range m .Series {
141+ for _ , s := range m .SeriesCache . Series {
106142 series = append (series , s )
107143 }
108144
@@ -130,7 +166,7 @@ func NewTcmMetric(meta *TcmMeta, conf *TcmMetricConfig) (*TcmMetric, error) {
130166 return nil , err
131167 }
132168
133- statDescs := make (map [string ]* prometheus. Desc )
169+ statDescs := make (map [string ]Desc )
134170 statType , err := meta .GetStatType (conf .StatPeriodSeconds )
135171 if err != nil {
136172 return nil , err
@@ -142,10 +178,6 @@ func NewTcmMetric(meta *TcmMeta, conf *TcmMetricConfig) (*TcmMetric, error) {
142178 statType ,
143179 * meta .m .Meaning .Zh ,
144180 )
145- var lnames []string
146- for _ , name := range labels .Names {
147- lnames = append (lnames , util .ToUnderlineLower (name ))
148- }
149181 for _ , s := range conf .StatTypes {
150182 var st string
151183 if s == "last" {
@@ -176,20 +208,18 @@ func NewTcmMetric(meta *TcmMeta, conf *TcmMetricConfig) (*TcmMetric, error) {
176208 st ,
177209 )
178210 fqName = strings .ToLower (fqName )
179- desc := prometheus .NewDesc (
180- fqName ,
181- help ,
182- lnames ,
183- nil ,
184- )
185- statDescs [strings .ToLower (s )] = desc
211+ statDescs [strings .ToLower (s )] = Desc {
212+ FQName : fqName ,
213+ Help : help ,
214+ }
186215 }
187216
188217 m := & TcmMetric {
189- Id : id ,
190- Meta : meta ,
191- Labels : labels ,
192- Series : map [string ]* TcmSeries {},
218+ Id : id ,
219+ Meta : meta ,
220+ Labels : labels ,
221+ SeriesCache : newCache (),
222+
193223 StatPromDesc : statDescs ,
194224 Conf : conf ,
195225 }
0 commit comments