Skip to content

Commit 5318702

Browse files
authored
Merge pull request #57 from BattleL/dev/support-service-role
Dev/support service role
2 parents 51854f9 + eeacb45 commit 5318702

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+1292
-570
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22
/.idea
33
build/*
44
qcloud.yml
5-
.DS_Store
5+
.DS_Store
6+
*mock.go
7+
/bin

README.md

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,26 +82,27 @@ products:
8282
credential:
8383
access_key: <YOUR_ACCESS_KEY> // 必须, 云API的SecretId
8484
access_secret: <YOUR_ACCESS_SECRET> // 必须, 云API的SecretKey
85+
role: <YOUR_SERVICE_ROLE> // 可选,可在云上CVM/TKE中使用,没有access_key和access_secret时会使用role申请临时密钥
8586
region: <REGION> // 必须, 实例所在区域信息
8687

87-
rate_limit: 15 // 腾讯云监控拉取指标数据限制, 官方默认限制最大20qps
88+
rate_limit: 15 // 腾讯云监控拉取指标数据限制, 官方默认限制最大20qps
8889

8990

90-
// 整个产品纬度配置, 每个产品一个item
91+
// 整个产品纬度配置, 每个产品一个item
9192
products:
9293
- namespace: QCE/CMONGO // 必须, 产品命名空间; QCE前缀可自定义,CMONGO产品名不区分大小写, 可用别名
93-
all_metrics: true // 常用, 推荐开启, 导出支持的所有指标
94-
all_instances: true // 常用, 推荐开启, 导出该region下的所有实例
94+
all_metrics: true // 常用, 推荐开启, 导出支持的所有指标
95+
all_instances: true // 常用, 推荐开启, 导出该region下的所有实例
9596
extra_labels: [InstanceName,Zone] // 可选, 将实例的字段作为指标的lables导出
9697
only_include_metrics: [Inserts] // 可选, 只导出这些指标, 配置时all_metrics失效
9798
exclude_metrics: [Reads] // 可选, 不导出这些指标
9899
instance_filters: // 可选, 在all_instances开启情况下, 根据每个实例的字段进行过滤
99100
- ProjectId: 1
100-
Status: 1
101+
Status: 1
101102
only_include_instances: [cmgo-xxxxxxxx] // 可选, 只导出这些实例id, 配置时all_instances失效
102103
exclude_instances: [cmgo-xxxxxxxx] // 可选, 不导出这些实例id
103104
custom_query_dimensions: // 可选, 不常用, 自定义指标查询条件, 配置时all_instances,only_include_instances,exclude_instances失效, 用于不支持按实例纬度查询的指标
104-
- target: cmgo-xxxxxxxx
105+
- target: cmgo-xxxxxxxx
105106
statistics_types: [avg] // 可选, 拉取N个数据点, 再进行max、min、avg、last计算, 默认last取最新值
106107
period_seconds: 60 // 可选, 指标统计周期, 默认自动获取指标支持的最小统计周期
107108
range_seconds: 300 // 可选, 选取时间范围, 开始时间=now-range_seconds, 结束时间=now
@@ -112,33 +113,33 @@ products:
112113

113114
// 单个指标纬度配置, 每个指标一个item
114115
metrics:
115-
- tc_namespace: QCE/CMONGO // 产品命名空间, 同namespace
116+
- tc_namespace: QCE/CMONGO // 产品命名空间, 同namespace
116117
tc_metric_name: Inserts // 云监控定义的指标名
117118
tc_metric_rename: Inserts // 导出指标的显示名
118119
tc_metric_name_type: 1 // 可选,导出指标的名字格式化类型, 1=大写转小写加下划线, 2=转小写; 默认1
119120
tc_labels: [InstanceName] // 可选, 将实例的字段作为指标的lables导出
120121
tc_filters: // 可选, 根据每个实例的字段进行过滤, 否则默认导出region下所有实例
121122
- ProjectId: 1
122-
Status: 1
123+
Status: 1
123124
tc_myself_dimensions: // 可选, 同custom_query_dimensions
124125
tc_statistics: [Avg] // 可选, 同statistics_types
125126
period_seconds: 60 // 可选, 同period_seconds
126127
range_seconds: 300 // 可选, 同range_seconds
127128
delay_seconds: 60 // 可选, 同delay_seconds
128-
129129
```
130130
特殊说明:
131131
1. **custom_query_dimensions**
132-
每个实例的纬度字段信息, 可从对应的云监控产品指标文档查询, 如mongo支持的纬度字段信息可由[云监控指标详情](https://cloud.tencent.com/document/product/248/45104#%E5%90%84%E7%BB%B4%E5%BA%A6%E5%AF%B9%E5%BA%94%E5%8F%82%E6%95%B0%E6%80%BB%E8%A7%88) 查询
132+
每个实例的纬度字段信息, 可从对应的云监控产品指标文档查询, 如mongo支持的纬度字段信息可由[云监控指标详情](https://cloud.tencent.com/document/product/248/45104#%E5%90%84%E7%BB%B4%E5%BA%A6%E5%AF%B9%E5%BA%94%E5%8F%82%E6%95%B0%E6%80%BB%E8%A7%88) 查询
133133
2. **extra_labels**
134-
每个导出metric的labels还额外上报实例对应的字段信息, 实例可选的字段列表可从对应产品文档查询, 如mongo实例支持的字段可从[实例查询api文档](https://cloud.tencent.com/document/product/240/38568) 获取, 目前只支持str、int类型的字段
134+
每个导出metric的labels还额外上报实例对应的字段信息, 实例可选的字段列表可从对应产品文档查询, 如mongo实例支持的字段可从[实例查询api文档](https://cloud.tencent.com/document/product/240/38568) 获取, 目前只支持str、int类型的字段
135135
3. **period_seconds**
136-
每个指标支持的时间纬度统计, 一般支持60、300秒等, 具体可由对应产品的云监控产品指标文档查询, 如mongo可由[指标元数据查询](https://cloud.tencent.com/document/product/248/30351) , 假如不配置, 使用默认值(60), 假如该指标不支持60, 则自动使用该指标支持的最小值
136+
每个指标支持的时间纬度统计, 一般支持60、300秒等, 具体可由对应产品的云监控产品指标文档查询, 如mongo可由[指标元数据查询](https://cloud.tencent.com/document/product/248/30351) , 假如不配置, 使用默认值(60), 假如该指标不支持60, 则自动使用该指标支持的最小值
137137
4. **credential**
138-
SecretId、SecretKey、Region可由环境变量获取
138+
SecretId、SecretKey、Region可由环境变量获取
139139
```bash
140140
export TENCENTCLOUD_SECRET_ID="YOUR_ACCESS_KEY"
141141
export TENCENTCLOUD_SECRET_KEY="YOUR_ACCESS_SECRET"
142+
export TENCENTCLOUD_SERVICE_ROLE = "YOUR_SERVICE_ROLE"
142143
export TENCENTCLOUD_REGION="REGION"
143144
```
144145

@@ -156,7 +157,7 @@ export TENCENTCLOUD_REGION="REGION"
156157
--log.level|日志级别|info
157158

158159

159-
## 五、qcloud.yml样例
160+
## 五、qcloud.yml样例
160161
在git的configs里有支持产品的配置模版样例
161162

162163

cmd/qcloud-exporter/qcloud_exporter.go

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ import (
44
"fmt"
55
"net/http"
66
"os"
7+
"time"
78

8-
"github.com/go-kit/kit/log"
9-
"github.com/go-kit/kit/log/level"
9+
"github.com/tencentyun/tencentcloud-exporter/pkg/cachedtransactiongather"
10+
11+
"github.com/tencentyun/tencentcloud-exporter/pkg/common"
12+
13+
"github.com/go-kit/log"
14+
"github.com/go-kit/log/level"
1015
"github.com/prometheus/client_golang/prometheus"
1116
"github.com/prometheus/client_golang/prometheus/promhttp"
1217
"github.com/prometheus/common/promlog"
@@ -17,7 +22,9 @@ import (
1722
kingpin "gopkg.in/alecthomas/kingpin.v2"
1823
)
1924

20-
func newHandler(c *config.TencentConfig, includeExporterMetrics bool, maxRequests int, logger log.Logger) (*http.Handler, error) {
25+
func newHandler(cred common.CredentialIface, c *config.TencentConfig,
26+
includeExporterMetrics bool, maxRequests int, logger log.Logger) (*http.Handler, error) {
27+
2128
exporterMetricsRegistry := prometheus.NewRegistry()
2229
if includeExporterMetrics {
2330
exporterMetricsRegistry.MustRegister(
@@ -26,7 +33,7 @@ func newHandler(c *config.TencentConfig, includeExporterMetrics bool, maxRequest
2633
)
2734
}
2835

29-
nc, err := collector.NewTcMonitorCollector(c, logger)
36+
nc, err := collector.NewTcMonitorCollector(cred, c, logger)
3037
if err != nil {
3138
return nil, fmt.Errorf("couldn't create collector: %s", err)
3239
}
@@ -35,15 +42,24 @@ func newHandler(c *config.TencentConfig, includeExporterMetrics bool, maxRequest
3542
if err := r.Register(nc); err != nil {
3643
return nil, fmt.Errorf("couldn't register tencent cloud monitor collector: %s", err)
3744
}
45+
var handler http.Handler
46+
gatherers := prometheus.Gatherers{exporterMetricsRegistry, r}
47+
opts := promhttp.HandlerOpts{
48+
ErrorHandling: promhttp.ContinueOnError,
49+
MaxRequestsInFlight: maxRequests,
50+
Registry: exporterMetricsRegistry,
51+
}
52+
if c.CacheInterval <= 0 {
53+
handler = promhttp.HandlerFor(gatherers, opts)
54+
} else {
55+
handler = promhttp.HandlerForTransactional(
56+
cachedtransactiongather.NewCachedTransactionGather(
57+
prometheus.ToTransactionalGatherer(gatherers),
58+
time.Duration(c.CacheInterval)*time.Second, logger,
59+
), opts,
60+
)
61+
}
3862

39-
handler := promhttp.HandlerFor(
40-
prometheus.Gatherers{exporterMetricsRegistry, r},
41-
promhttp.HandlerOpts{
42-
ErrorHandling: promhttp.ContinueOnError,
43-
MaxRequestsInFlight: maxRequests,
44-
Registry: exporterMetricsRegistry,
45-
},
46-
)
4763
if includeExporterMetrics {
4864
handler = promhttp.InstrumentMetricHandler(
4965
exporterMetricsRegistry, handler,
@@ -94,7 +110,27 @@ func main() {
94110
level.Info(logger).Log("msg", "Load config ok")
95111
}
96112

97-
handler, err := newHandler(tencentConfig, *enableExporterMetrics, *maxRequests, logger)
113+
cred := &common.Credential{}
114+
if tencentConfig.Credential.Role != "" {
115+
var err error
116+
cred, err = common.NewCredential(tencentConfig.Credential.Role)
117+
if err != nil {
118+
level.Error(logger).Log("msg", "init cred error", "err", err)
119+
panic(err)
120+
}
121+
go func() {
122+
err := cred.Refresh()
123+
if err != nil {
124+
level.Error(logger).Log("msg", "cred refresh error", "err", err)
125+
panic(err)
126+
}
127+
}()
128+
} else {
129+
cred.SecretId = tencentConfig.Credential.AccessKey
130+
cred.SecretKey = tencentConfig.Credential.SecretKey
131+
}
132+
133+
handler, err := newHandler(cred, tencentConfig, *enableExporterMetrics, *maxRequests, logger)
98134
if err != nil {
99135
level.Error(logger).Log("msg", "Create handler fail", "err", err)
100136
os.Exit(1)

go.mod

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@ module github.com/tencentyun/tencentcloud-exporter
33
go 1.12
44

55
require (
6-
github.com/go-kit/kit v0.9.0
6+
github.com/go-kit/log v0.2.0
77
github.com/golang/mock v1.4.4
8-
github.com/prometheus/client_golang v1.5.1
9-
github.com/prometheus/common v0.9.1
8+
github.com/prometheus/client_golang v1.12.2-0.20220630150036-810fcb46abcd
9+
github.com/prometheus/client_model v0.2.0
10+
github.com/prometheus/common v0.35.0
1011
github.com/stretchr/testify v1.6.1
1112
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.334
1213
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.413
13-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.423
14+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.437
1415
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.334
1516
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.334
1617
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cmq v1.0.334
17-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.430
18+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.437
1819
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.334
1920
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.413
2021
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.334
@@ -34,6 +35,6 @@ require (
3435
github.com/tencentyun/cos-go-sdk-v5 v0.7.35
3536
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
3637
gopkg.in/alecthomas/kingpin.v2 v2.2.6
37-
gopkg.in/yaml.v2 v2.2.5
38+
gopkg.in/yaml.v2 v2.4.0
3839

3940
)

0 commit comments

Comments
 (0)