Skip to content

Commit

Permalink
add a new binding component : alicloud sls log storage (#1873)
Browse files Browse the repository at this point in the history
* new a bingding componet alicloud sls logstorage

Signed-off-by: RcXu <[email protected]>
Signed-off-by: Bernd Verst <[email protected]>

* update sls binding component

Signed-off-by: RcXu <[email protected]>
Signed-off-by: Bernd Verst <[email protected]>

* update the metadata decode method

Signed-off-by: RcXu <[email protected]>
Signed-off-by: Bernd Verst <[email protected]>

* make modtidy-all

Signed-off-by: Bernd Verst <[email protected]>

* sort imports

Signed-off-by: Bernd Verst <[email protected]>

Co-authored-by: RcXu <[email protected]>
Co-authored-by: Bernd Verst <[email protected]>
Co-authored-by: Dapr Bot <[email protected]>
  • Loading branch information
4 people authored Aug 5, 2022
1 parent 5b14b00 commit 66d92cd
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 0 deletions.
127 changes: 127 additions & 0 deletions bindings/alicloud/sls/sls.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package sls

import (
"context"
"encoding/json"
"fmt"
"time"

sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/aliyun/aliyun-log-go-sdk/producer"

"github.com/dapr/components-contrib/bindings"
"github.com/dapr/kit/config"
"github.com/dapr/kit/logger"
)

type AliCloudSlsLogstorage struct {
logger logger.Logger
producer *producer.Producer
metadata SlsLogstorageMetadata
}

type SlsLogstorageMetadata struct {
Endpoint string `json:"endpoint"`
AccessKeyID string `json:"accessKeyID"`
AccessKeySecret string `json:"accessKeySecret"`
}

type Callback struct {
s *AliCloudSlsLogstorage
}

// parse metadata field
func (s *AliCloudSlsLogstorage) Init(metadata bindings.Metadata) error {
m, err := s.parseMeta(metadata)
if err != nil {
return err
}
s.metadata = *m
producerConfig := producer.GetDefaultProducerConfig()
// the config properties in the component yaml file
producerConfig.Endpoint = m.Endpoint
producerConfig.AccessKeyID = m.AccessKeyID
producerConfig.AccessKeySecret = m.AccessKeySecret
s.producer = producer.InitProducer(producerConfig)

s.producer.Start()
return nil
}

func NewAliCloudSlsLogstorage(logger logger.Logger) *AliCloudSlsLogstorage {
logger.Debug("initialized Sls log storage binding component")
s := &AliCloudSlsLogstorage{
logger: logger,
}
return s
}

func (s *AliCloudSlsLogstorage) Invoke(ctx context.Context, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) {
// verify the metadata property
if logProject := req.Metadata["project"]; logProject == "" {
return nil, fmt.Errorf("SLS binding error: project property not supplied")
}
if logstore := req.Metadata["logstore"]; logstore == "" {
return nil, fmt.Errorf("SLS binding error: logstore property not supplied")
}
if topic := req.Metadata["topic"]; topic == "" {
return nil, fmt.Errorf("SLS binding error: topic property not supplied")
}
if source := req.Metadata["source"]; source == "" {
return nil, fmt.Errorf("SLS binding error: source property not supplied")
}

log, err := s.parseLog(req)
if err != nil {
s.logger.Info(err)
return nil, err
}

s.logger.Debug(log)
callBack := &Callback{}
err = s.producer.SendLogWithCallBack(req.Metadata["project"], req.Metadata["logstore"], req.Metadata["topic"], req.Metadata["source"], log, callBack)
if err != nil {
s.logger.Info(err)
return nil, err
}
return nil, nil
}

// parse the log content
func (s *AliCloudSlsLogstorage) parseLog(req *bindings.InvokeRequest) (*sls.Log, error) {
var logInfo map[string]string
err := json.Unmarshal(req.Data, &logInfo)
if err != nil {
return nil, err
}
return producer.GenerateLog(uint32(time.Now().Unix()), logInfo), nil
}

func (s *AliCloudSlsLogstorage) parseMeta(metadata bindings.Metadata) (*SlsLogstorageMetadata, error) {
var m SlsLogstorageMetadata
err := config.Decode(metadata.Properties, &m)
if err != nil {
return nil, err
}

return &m, nil
}

func (s *AliCloudSlsLogstorage) Operations() []bindings.OperationKind {
return []bindings.OperationKind{bindings.CreateOperation}
}

func (callback *Callback) Success(result *producer.Result) {
}

func (callback *Callback) Fail(result *producer.Result) {
msg := "unknown reason"
if result.GetErrorMessage() != "" {
msg = result.GetErrorMessage()
}
if result.GetErrorCode() != "" {
callback.s.logger.Debug("Failed error code:", result.GetErrorCode())
}

callback.s.logger.Info("Log storage failed:", msg)
}
59 changes: 59 additions & 0 deletions bindings/alicloud/sls/sls_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package sls

import (
"encoding/json"
"testing"

"github.com/stretchr/testify/assert"

"github.com/dapr/components-contrib/bindings"
)

/**
* test the metadata in the yaml file
*/
func TestSlsLogstorageMetadata(t *testing.T) {
m := bindings.Metadata{}
m.Properties = map[string]string{
"Endpoint": "ENDPOINT",
"AccessKeyID": "ACCESSKEYID",
"AccessKeySecret": "ACCESSKEYSECRET",
}
aliCloudSlsLogstorage := AliCloudSlsLogstorage{}

meta, err := aliCloudSlsLogstorage.parseMeta(m)

assert.Nil(t, err)
assert.Equal(t, "ENDPOINT", meta.Endpoint)
assert.Equal(t, "ACCESSKEYID", meta.AccessKeyID)
assert.Equal(t, "ACCESSKEYSECRET", meta.AccessKeySecret)
}

/*
* test the log content
*/
func TestParseLog(t *testing.T) {
aliCloudSlsLogstorage := AliCloudSlsLogstorage{}
d, _ := json.Marshal(map[string]string{
"log1": "LOG1",
"log2": "LOG2",
})
log := bindings.InvokeRequest{
Data: d,
Metadata: map[string]string{
"project": "PROJECT",
"logstore": "LOGSTORE",
"topic": "TOPIC",
"source": "SOURCE",
},
}
parseLog, _ := aliCloudSlsLogstorage.parseLog(&log)
for _, v := range parseLog.Contents {
switch *v.Key {
case "log1":
assert.Equal(t, "LOG1", *v.Value)
case "log2":
assert.Equal(t, "LOG2", *v.Value)
}
}
}
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ require (
cloud.google.com/go/secretmanager v1.4.0
dubbo.apache.org/dubbo-go/v3 v3.0.3-0.20220610080020-48691a404537
github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig v0.4.0
github.com/aliyun/aliyun-log-go-sdk v0.1.37
github.com/apache/dubbo-go-hessian2 v1.11.0
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.21.12+incompatible
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.0.87
Expand Down Expand Up @@ -221,6 +222,7 @@ require (
github.com/flynn/noise v1.0.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/go-kit/kit v0.10.0 // indirect
github.com/go-kit/log v0.2.0 // indirect
github.com/go-logfmt/logfmt v0.5.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
Expand Down
7 changes: 7 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,8 @@ github.com/alicebob/miniredis/v2 v2.13.3 h1:kohgdtN58KW/r9ZDVmMJE3MrfbumwsDQStd0
github.com/alicebob/miniredis/v2 v2.13.3/go.mod h1:uS970Sw5Gs9/iK3yBg0l9Uj9s25wXxSpQUE9EaJ/Blg=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.18 h1:zOVTBdCKFd9JbCKz9/nt+FovbjPFmb7mUnp8nH9fQBA=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk=
github.com/aliyun/aliyun-log-go-sdk v0.1.37 h1:GvswbgLqVOHNeMWssQ9zA+R7YVDP6arLUP92bKyGZNw=
github.com/aliyun/aliyun-log-go-sdk v0.1.37/go.mod h1:1QQ59pEJiVVXqKgbHcU6FWIgxT5RKBt+CT8AiQ2bEts=
github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible h1:HXvOJsZw8JT/ldxjX74Aq4H2IY4ojV/mXMDPWFitpv8=
github.com/aliyun/aliyun-oss-go-sdk v2.0.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/aliyun/aliyun-tablestore-go-sdk v1.6.0 h1:Vug1AcQD1bOW1AMrr+61oTCP/NWhGDYzN2FuMXT78yQ=
Expand Down Expand Up @@ -501,6 +503,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
Expand Down Expand Up @@ -830,6 +834,7 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
Expand Down Expand Up @@ -869,6 +874,7 @@ github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I
github.com/go-ini/ini v1.66.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo=
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
Expand Down Expand Up @@ -2484,6 +2490,7 @@ github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rK
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI=
Expand Down

0 comments on commit 66d92cd

Please sign in to comment.