Skip to content

Commit 750f43c

Browse files
authored
Merge pull request #77 from zianazhao/master
支持查询磁盘分区使用率
2 parents f44cd4a + 30a1716 commit 750f43c

File tree

3 files changed

+236
-1
lines changed

3 files changed

+236
-1
lines changed

pkg/collector/handler_cbs.go

Lines changed: 181 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package collector
22

33
import (
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

913
const (
@@ -17,6 +21,7 @@ func init() {
1721

1822
type cbsHandler struct {
1923
baseProductHandler
24+
instanceInfosRepo instance.CbsTcInstanceInfosRepository
2025
}
2126

2227
func (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+
34208
func 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

pkg/instance/repository_cbs.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/go-kit/log"
77
"github.com/go-kit/log/level"
88
sdk "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312"
9+
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
910
"github.com/tencentyun/tencentcloud-exporter/pkg/client"
1011
"github.com/tencentyun/tencentcloud-exporter/pkg/common"
1112
"github.com/tencentyun/tencentcloud-exporter/pkg/config"
@@ -94,3 +95,54 @@ func NewCbsTcInstanceRepository(cred common.CredentialIface, c *config.TencentCo
9495
}
9596
return
9697
}
98+
99+
// cvm instance
100+
type CbsTcInstanceInfosRepository interface {
101+
Get(id string) ([]string, error)
102+
GetInstanceInfosInfoByFilters([]string) (*cvm.DescribeInstancesResponse, error)
103+
}
104+
105+
type CbsTcInstanceInfosRepositoryImpl struct {
106+
client *cvm.Client
107+
logger log.Logger
108+
}
109+
110+
func (repo *CbsTcInstanceInfosRepositoryImpl) Get(id string) (instanceIds []string, err error) {
111+
req := cvm.NewDescribeInstancesRequest()
112+
req.InstanceIds = []*string{&id}
113+
resp, err := repo.client.DescribeInstances(req)
114+
if err != nil {
115+
return
116+
}
117+
for _, instanceInfo := range resp.Response.InstanceSet {
118+
instanceIds = append(instanceIds, *instanceInfo.InstanceId)
119+
}
120+
return
121+
}
122+
123+
func (repo *CbsTcInstanceInfosRepositoryImpl) GetInstanceInfosInfoByFilters(ids []string) (instances *cvm.DescribeInstancesResponse, err error) {
124+
req := cvm.NewDescribeInstancesRequest()
125+
var offset int64 = 0
126+
var limit int64 = 100
127+
128+
req.Offset = &offset
129+
req.Limit = &limit
130+
if ids!=nil{
131+
for _, id := range ids {
132+
req.InstanceIds = []*string{&id}
133+
}
134+
}
135+
return repo.client.DescribeInstances(req)
136+
}
137+
138+
func NewCbsTcInstanceInfosRepository(cred common.CredentialIface, c *config.TencentConfig, logger log.Logger) (CbsTcInstanceInfosRepository, error) {
139+
cli, err := client.NewCvmClient(cred, c)
140+
if err != nil {
141+
return nil, err
142+
}
143+
repo := &CbsTcInstanceInfosRepositoryImpl{
144+
client: cli,
145+
logger: logger,
146+
}
147+
return repo, nil
148+
}

pkg/metric/label.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ func (l *TcmLabels) GetValues(filters map[string]string, ins instance.TcInstance
4444
}
4545
}
4646
for _, name := range l.instanceLabelNames {
47+
if ins == nil {
48+
continue
49+
}
4750
vMap, e := ins.GetFieldValuesByName(name)
4851
if e == nil && vMap != nil {
4952
for vName, values := range vMap {

0 commit comments

Comments
 (0)