Skip to content

Commit 5bfa9d2

Browse files
authored
support logstore metering mode (aliyun#230)
* feat: supp logstore metering mode * test: add ft
1 parent 487e9c7 commit 5bfa9d2

7 files changed

+122
-3
lines changed

client_interface.go

+6
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ type ClientInterface interface {
133133
UpdateLogStoreV2(project string, logstore *LogStore) error
134134
// CheckLogstoreExist check logstore exist or not
135135
CheckLogstoreExist(project string, logstore string) (bool, error)
136+
// GetLogStoreMeteringMode get the metering mode of logstore, eg. ChargeByFunction / ChargeByDataIngest
137+
GetLogStoreMeteringMode(project string, logstore string) (*GetMeteringModeResponse, error)
138+
// GetLogStoreMeteringMode update the metering mode of logstore, eg. ChargeByFunction / ChargeByDataIngest
139+
//
140+
// Warning: this method may affect your billings, for more details ref: https://www.aliyun.com/price/detail/sls
141+
UpdateLogStoreMeteringMode(project string, logstore string, meteringMode string) error
136142

137143
// #################### MetricStore Operations #####################
138144
// CreateMetricStore creates a new metric store in SLS.

client_project.go

+17-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ func (c *Client) ListLogStore(project string) ([]string, error) {
1818
}
1919

2020
// ListLogStoreV2 list logstores with params :
21-
// offset: start offset
22-
// size: max return size
23-
// telemetryType : telemetry type filter
21+
//
22+
// offset: start offset
23+
// size: max return size
24+
// telemetryType : telemetry type filter
2425
func (c *Client) ListLogStoreV2(project string, offset, size int, telemetryType string) ([]string, error) {
2526
proj := convert(c, project)
2627
return proj.ListLogStoreV2(offset, size, telemetryType)
@@ -69,6 +70,19 @@ func (c *Client) UpdateLogStoreV2(project string, logstore *LogStore) (err error
6970
return proj.UpdateLogStoreV2(logstore)
7071
}
7172

73+
// GetLogStoreMeteringMode get the metering mode of logstore, eg. ChargeByFunction / ChargeByDataIngest
74+
func (c *Client) GetLogStoreMeteringMode(project string, logstore string) (*GetMeteringModeResponse, error) {
75+
ls := convertLogstore(c, project, logstore)
76+
return ls.GetMeteringMode()
77+
}
78+
79+
// GetLogStoreMeteringMode update the metering mode of logstore, eg. ChargeByFunction / ChargeByDataIngest
80+
// Warning: this method may affect your billings, for more details ref: https://www.aliyun.com/price/detail/sls
81+
func (c *Client) UpdateLogStoreMeteringMode(project string, logstore string, meteringMode string) error {
82+
ls := convertLogstore(c, project, logstore)
83+
return ls.UpdateMeteringMode(meteringMode)
84+
}
85+
7286
// ListMachineGroup returns machine group name list and the total number of machine groups.
7387
// The offset starts from 0 and the size is the max number of machine groups could be returned.
7488
func (c *Client) ListMachineGroup(project string, offset, size int) (m []string, total int, err error) {

client_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,22 @@ func (s *ClientTestSuite) TestClientCommonHeader() {
8888
s.Require().NoError(err)
8989
fmt.Println(len(stores))
9090
}
91+
92+
func (s *ClientTestSuite) TestMeteringMode() {
93+
94+
res, err := s.client.GetLogStoreMeteringMode(s.env.ProjectName, s.env.LogstoreName)
95+
s.Require().NoError(err)
96+
s.Require().Equal(CHARGE_BY_FUNCTION, res.MeteringMode)
97+
// change to data ingest
98+
err = s.client.UpdateLogStoreMeteringMode(s.env.ProjectName, s.env.LogstoreName, CHARGE_BY_DATA_INGEST)
99+
s.Require().NoError(err)
100+
res, err = s.client.GetLogStoreMeteringMode(s.env.ProjectName, s.env.LogstoreName)
101+
s.Require().NoError(err)
102+
s.Require().Equal(CHARGE_BY_DATA_INGEST, res.MeteringMode)
103+
// change back
104+
err = s.client.UpdateLogStoreMeteringMode(s.env.ProjectName, s.env.LogstoreName, CHARGE_BY_FUNCTION)
105+
s.Require().NoError(err)
106+
res, err = s.client.GetLogStoreMeteringMode(s.env.ProjectName, s.env.LogstoreName)
107+
s.Require().NoError(err)
108+
s.Require().Equal(CHARGE_BY_FUNCTION, res.MeteringMode)
109+
}

error_code.go

+1
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,4 @@ const CONFIG_NOT_EXIST = "ConfigNotExist"
5252
const CONFIG_ALREADY_EXIST = "ConfigAlreadyExist"
5353
const BAD_REQUEST = "BadRequest"
5454
const INVALID_PARAMETER = "InvalidParameter"
55+
const NOT_SUPPORTED = "NotSupported"

log_store.go

+50
Original file line numberDiff line numberDiff line change
@@ -1076,3 +1076,53 @@ func (s *LogStore) CheckIndexExist() (bool, error) {
10761076

10771077
return true, nil
10781078
}
1079+
1080+
func (s *LogStore) GetMeteringMode() (*GetMeteringModeResponse, error) {
1081+
h := map[string]string{
1082+
"x-log-bodyrawsize": "0",
1083+
"Content-Type": "application/json",
1084+
}
1085+
uri := fmt.Sprintf("/logstores/%s/meteringmode", s.Name)
1086+
r, err := request(s.project, "GET", uri, h, nil)
1087+
if err != nil {
1088+
return nil, err
1089+
}
1090+
defer r.Body.Close()
1091+
data, err := ioutil.ReadAll(r.Body)
1092+
if err != nil {
1093+
return nil, NewBadResponseError("", r.Header, r.StatusCode)
1094+
}
1095+
res := GetMeteringModeResponse{}
1096+
err = json.Unmarshal(data, &res)
1097+
if err != nil {
1098+
return nil, NewBadResponseError(string(data), r.Header, r.StatusCode)
1099+
1100+
}
1101+
return &res, nil
1102+
1103+
}
1104+
1105+
func (s *LogStore) UpdateMeteringMode(meteringMode string) error {
1106+
1107+
body := map[string]string{
1108+
"meteringMode": meteringMode,
1109+
}
1110+
uri := fmt.Sprintf("/logstores/%s/meteringmode", s.Name)
1111+
requestBody, err := json.Marshal(body)
1112+
if err != nil {
1113+
return fmt.Errorf("cant marshal body:%w", err)
1114+
}
1115+
1116+
h := map[string]string{
1117+
"Content-Type": "application/json",
1118+
"x-log-bodyrawsize": strconv.Itoa(len(requestBody)),
1119+
}
1120+
1121+
r, err := request(s.project, "PUT", uri, h, requestBody)
1122+
1123+
if err != nil {
1124+
r.Body.Close()
1125+
return err
1126+
}
1127+
return nil
1128+
}

model.go

+9
Original file line numberDiff line numberDiff line change
@@ -293,3 +293,12 @@ func CreateDefaultIndex() *Index {
293293
},
294294
}
295295
}
296+
297+
type GetMeteringModeResponse struct {
298+
MeteringMode string `json:"meteringMode"`
299+
}
300+
301+
const (
302+
CHARGE_BY_FUNCTION = "ChargeByFunction"
303+
CHARGE_BY_DATA_INGEST = "ChargeByDataIngest"
304+
)

token_auto_update_client.go

+20
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,26 @@ func (c *TokenAutoUpdateClient) ListMachineGroup(project string, offset, size in
326326
return
327327
}
328328

329+
func (c *TokenAutoUpdateClient) GetLogStoreMeteringMode(project string, logstore string) (res *GetMeteringModeResponse, err error) {
330+
for i := 0; i < c.maxTryTimes; i++ {
331+
res, err = c.logClient.GetLogStoreMeteringMode(project, logstore)
332+
if !c.processError(err) {
333+
return
334+
}
335+
}
336+
return
337+
}
338+
339+
func (c *TokenAutoUpdateClient) UpdateLogStoreMeteringMode(project string, logstore string, meteringMode string) (err error) {
340+
for i := 0; i < c.maxTryTimes; i++ {
341+
err = c.logClient.UpdateLogStoreMeteringMode(project, logstore, meteringMode)
342+
if !c.processError(err) {
343+
return
344+
}
345+
}
346+
return
347+
}
348+
329349
func (c *TokenAutoUpdateClient) ListMachines(project, machineGroupName string) (ms []*Machine, total int, err error) {
330350
for i := 0; i < c.maxTryTimes; i++ {
331351
ms, total, err = c.logClient.ListMachines(project, machineGroupName)

0 commit comments

Comments
 (0)