Skip to content

Commit 0affabe

Browse files
committed
metrics for each database containers
1 parent 57c7268 commit 0affabe

File tree

2 files changed

+52
-24
lines changed

2 files changed

+52
-24
lines changed

client.go

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io/ioutil"
77
"log"
88
"net/http"
9+
"strconv"
910
"time"
1011
)
1112

@@ -16,6 +17,7 @@ type ConohaClient struct {
1617
token string
1718
tokenExpires time.Time
1819
accountEndpoint string
20+
objectStorageEndpoint string
1921
databaseHostingEndpoint string
2022
}
2123

@@ -70,6 +72,8 @@ func NewClient(region string, tenantId string, username string, password string)
7072
switch service.Type {
7173
case "account":
7274
client.accountEndpoint = service.Endpoints[0].PublicURL
75+
case "object-store":
76+
client.objectStorageEndpoint = service.Endpoints[0].PublicURL
7377
case "databasehosting":
7478
client.databaseHostingEndpoint = service.Endpoints[0].PublicURL
7579
}
@@ -117,13 +121,13 @@ func tokenRequester(region string, tenantId string, username string, password st
117121
}
118122
}
119123

120-
func (cc *ConohaClient) get(url string) ([]byte, error) {
124+
func (cc *ConohaClient) get(url string) ([]byte, *http.Header, error) {
121125
// トークンの有効性を確認
122126
if cc.tokenExpires.Before(time.Now().Add(time.Minute)) {
123127
log.Println("Renewing token...")
124128
tokenResp, err := cc.requestNewToken(&cc.Client)
125129
if err != nil {
126-
return nil, err
130+
return nil, nil, err
127131
}
128132
cc.token = tokenResp.Access.Token.ID
129133
cc.tokenExpires = tokenResp.Access.Token.Expires
@@ -133,19 +137,23 @@ func (cc *ConohaClient) get(url string) ([]byte, error) {
133137
// GETリクエストを飛ばす
134138
req, err := http.NewRequest("GET", url, nil)
135139
if err != nil {
136-
return nil, err
140+
return nil, nil, err
137141
}
138142

139143
// ヘッダーにトークンをセットする
140144
req.Header.Set("X-Auth-Token", cc.token)
141145
resp, err := cc.Do(req)
142146
if err != nil {
143-
return nil, err
147+
return nil, nil, err
144148
}
145149
defer resp.Body.Close()
146150

147151
// レスポンスボディを返す
148-
return ioutil.ReadAll(resp.Body)
152+
buf, err := ioutil.ReadAll(resp.Body)
153+
if err != nil {
154+
return nil, nil, err
155+
}
156+
return buf, &resp.Header, nil
149157
}
150158

151159
// JSON 受け取り用
@@ -160,7 +168,7 @@ type Usage struct {
160168
// オブジェクトストレージへのリクエスト数を取得
161169
func (cc *ConohaClient) ObjectStorageRequests() (map[string]float64, error) {
162170
// メトリクス取得
163-
resp, err := cc.get(cc.accountEndpoint + "/object-storage/rrd/request")
171+
resp, _, err := cc.get(cc.accountEndpoint + "/object-storage/rrd/request")
164172
if err != nil {
165173
return nil, err
166174
}
@@ -182,32 +190,41 @@ func (cc *ConohaClient) ObjectStorageRequests() (map[string]float64, error) {
182190
}
183191

184192
// JSON 受け取り用
185-
type ObjectStorageSizeResponse struct {
186-
Size Usage `json:"size"`
193+
type ObjectStorageResponse []Container
194+
type Container struct {
195+
Count int `json:"count"`
196+
Bytes int `json:"bytes"`
197+
Name string `json:"name"`
198+
}
199+
200+
type ObjectStorageUsage struct {
201+
containers []Container
202+
quota float64
187203
}
188204

189205
// オブジェクトストレージの使用容量を取得
190-
func (cc *ConohaClient) ObjectStorageUsage() (map[string]float64, error) {
206+
func (cc *ConohaClient) ObjectStorageUsage() (*ObjectStorageUsage, error) {
191207
// メトリクス取得
192-
resp, err := cc.get(cc.accountEndpoint + "/object-storage/rrd/size")
208+
resp, headers, err := cc.get(cc.objectStorageEndpoint + "?format=json")
193209
if err != nil {
194210
return nil, err
195211
}
196212

197213
// JSONを読む
198-
var uResp ObjectStorageSizeResponse
214+
var uResp ObjectStorageResponse
199215
if err := json.Unmarshal(resp, &uResp); err != nil {
200216
return nil, err
201217
}
202218

203-
// データ整形
204-
data := uResp.Size.Data[len(uResp.Size.Data)-3]
205-
usage := make(map[string]float64)
206-
for i, label := range uResp.Size.Schema {
207-
usage[label] = data[i]
219+
quota, err := strconv.ParseFloat(headers.Get("X-Account-Meta-Quota-Bytes"), 64)
220+
if err != nil {
221+
return nil, err
208222
}
209223

210-
return usage, nil
224+
return &ObjectStorageUsage{
225+
containers: uResp,
226+
quota: quota,
227+
}, nil
211228
}
212229

213230
// JSON 受け取り用
@@ -231,7 +248,7 @@ type Database struct {
231248

232249
// データベース一覧取得
233250
func (cc *ConohaClient) Databases() ([]*Database, error) {
234-
resp, err := cc.get(cc.databaseHostingEndpoint + "/databases")
251+
resp, _, err := cc.get(cc.databaseHostingEndpoint + "/databases")
235252
if err != nil {
236253
return nil, err
237254
}
@@ -263,7 +280,7 @@ type Quota struct {
263280

264281
// データベース上限値取得(GB単位)
265282
func (cc *ConohaClient) DatabaseQuota(serviceID string) (*Quota, error) {
266-
resp, err := cc.get(cc.databaseHostingEndpoint + "/services/" + serviceID + "/quotas")
283+
resp, _, err := cc.get(cc.databaseHostingEndpoint + "/services/" + serviceID + "/quotas")
267284
if err != nil {
268285
return nil, err
269286
}
@@ -284,7 +301,7 @@ type DatabaseInfoResponse struct {
284301

285302
// データベース情報取得(GB単位)
286303
func (cc *ConohaClient) DatabaseInfo(databaseID string) (*Database, error) {
287-
resp, err := cc.get(cc.databaseHostingEndpoint + "/databases/" + databaseID)
304+
resp, _, err := cc.get(cc.databaseHostingEndpoint + "/databases/" + databaseID)
288305
if err != nil {
289306
return nil, err
290307
}

exporter.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@ func NewConohaCollector(client *ConohaClient) (*ConohaCollector, error) {
3131
// NewDescの3番目の引数は可変ラベル(NewConstMetricの最後の可変長引数に対応してる)
3232
// 4番目のnilには、固定ラベルをprometheus.Labelsで渡せる
3333
prometheus.NewDesc("object_storage_requests", "Requests to Object Storage", []string{"method"}, nil),
34-
prometheus.NewDesc("object_storage_usage", "Usage of Object Storage", []string{}, nil),
34+
prometheus.NewDesc("object_storage_quota", "Object Storage Quota", []string{}, nil),
35+
prometheus.NewDesc("object_storage_usage", "Usage of Object Storage", []string{"container"}, nil),
36+
prometheus.NewDesc("object_storage_count", "Object Counts of Object Storage", []string{"container"}, nil),
3537
prometheus.NewDesc("database_usage", "Usage of Database (GB)", []string{"database"}, nil),
38+
prometheus.NewDesc("database_quota", "Database Quota (GB)", []string{"service"}, nil),
3639
},
3740
[]prometheus.Metric{},
3841
databases,
@@ -54,7 +57,15 @@ func (cc *ConohaCollector) AutoUpdate() {
5457

5558
// オブジェクトストレージ使用容量を取得
5659
usage, err := cc.ObjectStorageUsage()
57-
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[1], prometheus.GaugeValue, usage["value"]))
60+
if err != nil {
61+
log.Fatal(err)
62+
}
63+
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[1], prometheus.GaugeValue, usage.quota))
64+
65+
for _, container := range usage.containers {
66+
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[2], prometheus.GaugeValue, float64(container.Bytes), container.Name))
67+
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[3], prometheus.GaugeValue, float64(container.Count), container.Name))
68+
}
5869

5970
serviceIDs := make(map[string]bool)
6071

@@ -64,7 +75,7 @@ func (cc *ConohaCollector) AutoUpdate() {
6475
if err != nil {
6576
log.Fatal(err)
6677
}
67-
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[2], prometheus.GaugeValue, info.DbSize, db.DbName))
78+
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[4], prometheus.GaugeValue, info.DbSize, db.DbName))
6879

6980
serviceIDs[db.ServiceID] = true
7081
}
@@ -75,7 +86,7 @@ func (cc *ConohaCollector) AutoUpdate() {
7586
if err != nil {
7687
log.Fatal(err)
7788
}
78-
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[2], prometheus.GaugeValue, float64(quota.Quota), "Quota "+serviceID))
89+
metrics = append(metrics, prometheus.MustNewConstMetric(cc.describes[5], prometheus.GaugeValue, float64(quota.Quota), serviceID))
7990
}
8091

8192
// メトリクスデータ更新

0 commit comments

Comments
 (0)