Skip to content

Commit e27778f

Browse files
narcis96AkhigbeEromo
authored andcommitted
[receiver/huaweicloudces] add implementation (open-telemetry#36489)
Description Adds initial implementation of huaweicloudces. Link to tracking issue open-telemetry#34953
1 parent 76ca5c5 commit e27778f

19 files changed

+1816
-34
lines changed

receiver/huaweicloudcesreceiver/config.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,25 @@
44
package huaweicloudcesreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/huaweicloudcesreceiver"
55

66
import (
7+
"errors"
8+
"fmt"
9+
"slices"
10+
11+
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ces/v1/model"
12+
"go.opentelemetry.io/collector/component"
713
"go.opentelemetry.io/collector/config/confighttp"
814
"go.opentelemetry.io/collector/config/configopaque"
915
"go.opentelemetry.io/collector/config/configretry"
1016
"go.opentelemetry.io/collector/receiver/scraperhelper"
17+
"go.uber.org/multierr"
18+
)
19+
20+
var (
21+
// Predefined error responses for configuration validation failures
22+
errInvalidCollectionInterval = errors.New(`invalid period; must be less than "collection_interval"`)
23+
errMissingProjectID = errors.New(`"project_id" is not specified in config`)
24+
errMissingRegionID = errors.New(`"region_id" is not specified in config`)
25+
errInvalidProxy = errors.New(`"proxy_address" must be specified if "proxy_user" or "proxy_password" is set"`)
1126
)
1227

1328
// Config represent a configuration for the CloudWatch logs exporter.
@@ -63,3 +78,49 @@ type huaweiSessionConfig struct {
6378
ProxyUser string `mapstructure:"proxy_user"`
6479
ProxyPassword string `mapstructure:"proxy_password"`
6580
}
81+
82+
var _ component.Config = (*Config)(nil)
83+
84+
// These valid periods are defined by CES API constraints: https://support.huaweicloud.com/intl/en-us/api-ces/ces_03_0034.html#section3
85+
var validPeriods = []int32{1, 300, 1200, 3600, 14400, 86400}
86+
87+
// These valid filters are defined by CES API constraints: https://support.huaweicloud.com/intl/en-us/api-ces/ces_03_0034.html#section3
88+
var validFilters = map[string]model.ShowMetricDataRequestFilter{
89+
"max": model.GetShowMetricDataRequestFilterEnum().MAX,
90+
"min": model.GetShowMetricDataRequestFilterEnum().MIN,
91+
"average": model.GetShowMetricDataRequestFilterEnum().AVERAGE,
92+
"sum": model.GetShowMetricDataRequestFilterEnum().SUM,
93+
"variance": model.GetShowMetricDataRequestFilterEnum().VARIANCE,
94+
}
95+
96+
// Validate config
97+
func (config *Config) Validate() error {
98+
var err error
99+
if config.RegionID == "" {
100+
err = multierr.Append(err, errMissingRegionID)
101+
}
102+
103+
if config.ProjectID == "" {
104+
err = multierr.Append(err, errMissingProjectID)
105+
}
106+
if index := slices.Index(validPeriods, config.Period); index == -1 {
107+
err = multierr.Append(err, fmt.Errorf("invalid period: got %d; must be one of %v", config.Period, validPeriods))
108+
}
109+
if _, ok := validFilters[config.Filter]; !ok {
110+
var validFiltersSlice []string
111+
for key := range validFilters {
112+
validFiltersSlice = append(validFiltersSlice, key)
113+
}
114+
err = multierr.Append(err, fmt.Errorf("invalid filter: got %s; must be one of %v", config.Filter, validFiltersSlice))
115+
}
116+
if config.Period >= int32(config.CollectionInterval.Seconds()) {
117+
err = multierr.Append(err, errInvalidCollectionInterval)
118+
}
119+
120+
// Validate that ProxyAddress is provided if ProxyUser or ProxyPassword is set
121+
if (config.ProxyUser != "" || config.ProxyPassword != "") && config.ProxyAddress == "" {
122+
err = multierr.Append(err, errInvalidProxy)
123+
}
124+
125+
return err
126+
}

receiver/huaweicloudcesreceiver/factory.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ func createDefaultConfig() component.Config {
4141

4242
func createMetricsReceiver(
4343
_ context.Context,
44-
_ receiver.Settings,
45-
_ component.Config,
46-
_ consumer.Metrics,
44+
params receiver.Settings,
45+
cfg component.Config,
46+
next consumer.Metrics,
4747
) (receiver.Metrics, error) {
48-
return nil, nil
48+
return newHuaweiCloudCesReceiver(params, cfg.(*Config), next), nil
4949
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package huaweicloudcesreceiver
5+
6+
import (
7+
"context"
8+
"testing"
9+
"time"
10+
11+
"github.com/stretchr/testify/assert"
12+
"go.opentelemetry.io/collector/component"
13+
"go.opentelemetry.io/collector/component/componenttest"
14+
"go.opentelemetry.io/collector/consumer/consumertest"
15+
"go.opentelemetry.io/collector/receiver/receivertest"
16+
)
17+
18+
func TestNewFactory(t *testing.T) {
19+
factory := NewFactory()
20+
assert.NotNil(t, factory)
21+
assert.Equal(t, component.MustNewType("huaweicloudcesreceiver"), factory.Type())
22+
}
23+
24+
func TestCreateDefaultConfig(t *testing.T) {
25+
factory := NewFactory()
26+
config := factory.CreateDefaultConfig()
27+
assert.NotNil(t, config)
28+
assert.NoError(t, componenttest.CheckConfigStruct(config))
29+
}
30+
31+
func TestCreateMetricsReceiver(t *testing.T) {
32+
factory := NewFactory()
33+
config := factory.CreateDefaultConfig()
34+
35+
rConfig := config.(*Config)
36+
rConfig.CollectionInterval = 60 * time.Second
37+
rConfig.InitialDelay = time.Second
38+
39+
nextConsumer := new(consumertest.MetricsSink)
40+
receiver, err := factory.CreateMetrics(context.Background(), receivertest.NewNopSettings(), config, nextConsumer)
41+
assert.NoError(t, err)
42+
assert.NotNil(t, receiver)
43+
}

receiver/huaweicloudcesreceiver/generated_component_test.go

Lines changed: 51 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/huaweicloudcesreceiver/go.mod

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,86 @@ go 1.22.7
44

55
require (
66
github.com/cenkalti/backoff/v4 v4.3.0
7+
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.126
8+
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.115.0
9+
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.114.0
710
github.com/stretchr/testify v1.10.0
811
go.opentelemetry.io/collector/component v0.115.1-0.20241206185113-3f3e208e71b8
912
go.opentelemetry.io/collector/component/componenttest v0.115.1-0.20241206185113-3f3e208e71b8
1013
go.opentelemetry.io/collector/config/confighttp v0.115.1-0.20241206185113-3f3e208e71b8
1114
go.opentelemetry.io/collector/config/configopaque v1.21.1-0.20241206185113-3f3e208e71b8
1215
go.opentelemetry.io/collector/config/configretry v1.21.1-0.20241206185113-3f3e208e71b8
16+
go.opentelemetry.io/collector/confmap v1.21.1-0.20241206185113-3f3e208e71b8
1317
go.opentelemetry.io/collector/consumer v1.21.1-0.20241206185113-3f3e208e71b8
18+
go.opentelemetry.io/collector/consumer/consumertest v0.115.1-0.20241206185113-3f3e208e71b8
19+
go.opentelemetry.io/collector/pdata v1.21.1-0.20241206185113-3f3e208e71b8
1420
go.opentelemetry.io/collector/receiver v0.115.1-0.20241206185113-3f3e208e71b8
21+
go.opentelemetry.io/collector/receiver/receivertest v0.115.0
1522
go.uber.org/goleak v1.3.0
23+
go.uber.org/multierr v1.11.0
24+
go.uber.org/zap v1.27.0
1625
)
1726

1827
require (
28+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1929
github.com/davecgh/go-spew v1.1.1 // indirect
2030
github.com/felixge/httpsnoop v1.0.4 // indirect
2131
github.com/fsnotify/fsnotify v1.8.0 // indirect
2232
github.com/go-logr/logr v1.4.2 // indirect
2333
github.com/go-logr/stdr v1.2.2 // indirect
34+
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
2435
github.com/gogo/protobuf v1.3.2 // indirect
2536
github.com/golang/snappy v0.0.4 // indirect
2637
github.com/google/uuid v1.6.0 // indirect
2738
github.com/json-iterator/go v1.1.12 // indirect
2839
github.com/klauspost/compress v1.17.11 // indirect
40+
github.com/knadh/koanf/maps v0.1.1 // indirect
41+
github.com/knadh/koanf/providers/confmap v0.1.0 // indirect
42+
github.com/knadh/koanf/v2 v2.1.2 // indirect
43+
github.com/mitchellh/copystructure v1.2.0 // indirect
44+
github.com/mitchellh/reflectwalk v1.0.2 // indirect
2945
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3046
github.com/modern-go/reflect2 v1.0.2 // indirect
47+
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.115.0 // indirect
3148
github.com/pierrec/lz4/v4 v4.1.21 // indirect
3249
github.com/pmezard/go-difflib v1.0.0 // indirect
3350
github.com/rs/cors v1.11.1 // indirect
51+
github.com/stretchr/objx v0.5.2 // indirect
52+
github.com/tjfoc/gmsm v1.4.1 // indirect
53+
go.mongodb.org/mongo-driver v1.17.1 // indirect
3454
go.opentelemetry.io/collector/client v1.21.1-0.20241206185113-3f3e208e71b8 // indirect
3555
go.opentelemetry.io/collector/config/configauth v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
3656
go.opentelemetry.io/collector/config/configcompression v1.21.1-0.20241206185113-3f3e208e71b8 // indirect
3757
go.opentelemetry.io/collector/config/configtelemetry v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
3858
go.opentelemetry.io/collector/config/configtls v1.21.1-0.20241206185113-3f3e208e71b8 // indirect
3959
go.opentelemetry.io/collector/config/internal v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
60+
go.opentelemetry.io/collector/consumer/consumererror v0.115.0 // indirect
61+
go.opentelemetry.io/collector/consumer/consumerprofiles v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
4062
go.opentelemetry.io/collector/extension v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
4163
go.opentelemetry.io/collector/extension/auth v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
42-
go.opentelemetry.io/collector/pdata v1.21.1-0.20241206185113-3f3e208e71b8 // indirect
64+
go.opentelemetry.io/collector/pdata/pprofile v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
4365
go.opentelemetry.io/collector/pipeline v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
66+
go.opentelemetry.io/collector/receiver/receiverprofiles v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
4467
go.opentelemetry.io/collector/scraper v0.115.1-0.20241206185113-3f3e208e71b8 // indirect
4568
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect
4669
go.opentelemetry.io/otel v1.32.0 // indirect
4770
go.opentelemetry.io/otel/metric v1.32.0 // indirect
4871
go.opentelemetry.io/otel/sdk v1.32.0 // indirect
4972
go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect
5073
go.opentelemetry.io/otel/trace v1.32.0 // indirect
51-
go.uber.org/multierr v1.11.0 // indirect
52-
go.uber.org/zap v1.27.0 // indirect
53-
golang.org/x/net v0.31.0 // indirect
54-
golang.org/x/sys v0.27.0 // indirect
55-
golang.org/x/text v0.20.0 // indirect
56-
google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect
57-
google.golang.org/grpc v1.68.0 // indirect
74+
golang.org/x/crypto v0.30.0 // indirect
75+
golang.org/x/net v0.32.0 // indirect
76+
golang.org/x/sys v0.28.0 // indirect
77+
golang.org/x/text v0.21.0 // indirect
78+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect
79+
google.golang.org/grpc v1.68.1 // indirect
5880
google.golang.org/protobuf v1.35.2 // indirect
81+
gopkg.in/ini.v1 v1.67.0 // indirect
5982
gopkg.in/yaml.v3 v3.0.1 // indirect
6083
)
84+
85+
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil
86+
87+
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest
88+
89+
replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden

0 commit comments

Comments
 (0)