Skip to content

Commit 1a65fea

Browse files
authored
Merge branch 'main' into kafkaexporter_zipkin_encoding
2 parents bc96361 + 06f1f57 commit 1a65fea

Some content is hidden

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

48 files changed

+1113
-110
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
change_type: enhancement
2+
3+
component: opensearchexporter
4+
5+
note: implement [OpenSearch](https://opensearch.org/) exporter.
6+
7+
issues: [23611]
8+
9+
subtext:

.github/CODEOWNERS

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ processor/deltatorateprocessor/ @open-telemetry/collect
148148
processor/filterprocessor/ @open-telemetry/collector-contrib-approvers @TylerHelmuth @boostchicken
149149
processor/groupbyattrsprocessor/ @open-telemetry/collector-contrib-approvers @rnishtala-sumo
150150
processor/groupbytraceprocessor/ @open-telemetry/collector-contrib-approvers @jpkrohling
151-
processor/k8sattributesprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax @rmfitzpatrick @fatsheep9146
151+
processor/k8sattributesprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax @rmfitzpatrick @fatsheep9146 @TylerHelmuth
152152
processor/logstransformprocessor/ @open-telemetry/collector-contrib-approvers @djaglowski @dehaansa
153153
processor/metricsgenerationprocessor/ @open-telemetry/collector-contrib-approvers @Aneurysm9
154154
processor/metricstransformprocessor/ @open-telemetry/collector-contrib-approvers @dmitryax
@@ -208,9 +208,9 @@ receiver/influxdbreceiver/ @open-telemetry/collect
208208
receiver/jaegerreceiver/ @open-telemetry/collector-contrib-approvers @jpkrohling
209209
receiver/jmxreceiver/ @open-telemetry/collector-contrib-approvers @rmfitzpatrick
210210
receiver/journaldreceiver/ @open-telemetry/collector-contrib-approvers @sumo-drosiek @djaglowski
211-
receiver/k8sclusterreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax
212-
receiver/k8seventsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax
213-
receiver/k8sobjectsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @hvaghani221
211+
receiver/k8sclusterreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth
212+
receiver/k8seventsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @TylerHelmuth
213+
receiver/k8sobjectsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax @hvaghani221 @TylerHelmuth
214214
receiver/kafkametricsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax
215215
receiver/kafkareceiver/ @open-telemetry/collector-contrib-approvers @pavolloffay @MovieStoreGuy
216216
receiver/kubeletstatsreceiver/ @open-telemetry/collector-contrib-approvers @dmitryax

exporter/alibabacloudlogserviceexporter/metricsdata_to_logservice.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,9 @@ func doubleSummaryMetricsToLogs(name string, data pmetric.SummaryDataPointSlice,
269269
}
270270

271271
func metricDataToLogServiceData(md pmetric.Metric, defaultLabels KeyValues) (logs []*sls.Log) {
272+
//exhaustive:enforce
272273
switch md.Type() {
273-
case pmetric.MetricTypeEmpty:
274+
case pmetric.MetricTypeEmpty, pmetric.MetricTypeExponentialHistogram:
274275
break
275276
case pmetric.MetricTypeGauge:
276277
return numberMetricsToLogs(md.Name(), md.Gauge().DataPoints(), defaultLabels)

exporter/cassandraexporter/exporter_logs.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ func (e *logsExporter) pushLogsData(ctx context.Context, ld plog.Logs) error {
8989
for k := 0; k < rs.Len(); k++ {
9090
r := rs.At(k)
9191
logAttr := attributesToMap(r.Attributes().AsRaw())
92-
bodyByte, _ := json.Marshal(r.Body().AsRaw())
92+
bodyByte, err := json.Marshal(r.Body().AsRaw())
93+
if err != nil {
94+
return err
95+
}
9396

9497
insertLogError := e.client.Query(fmt.Sprintf(insertLogTableSQL, e.cfg.Keyspace, e.cfg.LogsTable),
9598
r.Timestamp().AsTime(),

exporter/fileexporter/buffered_writer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func TestBufferedWrites(t *testing.T) {
4545
}
4646

4747
var (
48-
benchmarkErr error
48+
errBenchmark error
4949
)
5050

5151
func BenchmarkWriter(b *testing.B) {
@@ -83,7 +83,7 @@ func BenchmarkWriter(b *testing.B) {
8383
for i := 0; i < b.N; i++ {
8484
_, err = w.Write(payload)
8585
}
86-
benchmarkErr = multierr.Combine(err, w.Close())
86+
errBenchmark = multierr.Combine(err, w.Close())
8787
})
8888
}
8989
}

exporter/opensearchexporter/README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ The documents are sent using [observability catalog](https://github.com/opensear
1717

1818
### HTTP Connection Options
1919
OpenSearch export supports standard (HTTP client settings](https://github.com/open-telemetry/opentelemetry-collector/tree/main/config/confighttp#client-configuration).
20-
- `endpoint` (required) `<url>:<port>` of OpenSearch node to send data to.
20+
- `http.endpoint` (required) `<url>:<port>` of OpenSearch node to send data to.
2121

2222
### TLS settings
2323
Supports standard TLS settings as part of HTTP settings. See [TLS Configuration/Client Settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configtls/README.md#client-configuration).
2424

2525
### Retry Options
2626
- `retry_on_failure`: See [retry_on_failure](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md)
2727

28+
### Timeout Options
29+
- `timeout` : See [timeout](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md)
2830
## Example
2931

3032
```yaml
@@ -36,9 +38,10 @@ extensions:
3638

3739
exporters:
3840
opensearch/trace:
39-
endpoint: https://opensearch.example.com:9200
40-
auth:
41-
authenticator: basicauth/client
41+
http:
42+
endpoint: https://opensearch.example.com:9200
43+
auth:
44+
authenticator: basicauth/client
4245
# ······
4346
service:
4447
pipelines:

exporter/opensearchexporter/config.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,43 @@ import (
88

99
"go.opentelemetry.io/collector/config/confighttp"
1010
"go.opentelemetry.io/collector/exporter/exporterhelper"
11+
"go.uber.org/multierr"
12+
)
13+
14+
const (
15+
// defaultNamespace value is used as ssoTracesExporter.Namespace when component.Config.Namespace is not set.
16+
defaultNamespace = "namespace"
17+
18+
// defaultDataset value is used as ssoTracesExporter.Dataset when component.Config.Dataset is not set.
19+
defaultDataset = "default"
1120
)
1221

1322
// Config defines configuration for OpenSearch exporter.
1423
type Config struct {
15-
confighttp.HTTPClientSettings `mapstructure:",squash"`
16-
exporterhelper.RetrySettings `mapstructure:"retry_on_failure"`
17-
Namespace string `mapstructure:"namespace"`
18-
Dataset string `mapstructure:"dataset"`
24+
confighttp.HTTPClientSettings `mapstructure:"http"`
25+
exporterhelper.RetrySettings `mapstructure:"retry_on_failure"`
26+
exporterhelper.TimeoutSettings `mapstructure:",squash"`
27+
Namespace string `mapstructure:"namespace"`
28+
Dataset string `mapstructure:"dataset"`
1929
}
2030

2131
var (
2232
errConfigNoEndpoint = errors.New("endpoint must be specified")
33+
errDatasetNoValue = errors.New("dataset must be specified")
34+
errNamespaceNoValue = errors.New("namespace must be specified")
2335
)
2436

2537
// Validate validates the opensearch server configuration.
2638
func (cfg *Config) Validate() error {
39+
var multiErr []error
2740
if len(cfg.Endpoint) == 0 {
28-
return errConfigNoEndpoint
41+
multiErr = append(multiErr, errConfigNoEndpoint)
42+
}
43+
if len(cfg.Dataset) == 0 {
44+
multiErr = append(multiErr, errDatasetNoValue)
45+
}
46+
if len(cfg.Namespace) == 0 {
47+
multiErr = append(multiErr, errNamespaceNoValue)
2948
}
30-
return nil
49+
return multierr.Combine(multiErr...)
3150
}

exporter/opensearchexporter/config_test.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ func TestLoadConfig(t *testing.T) {
2424
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml"))
2525
require.NoError(t, err)
2626

27-
defaultCfg := newDefaultConfig()
28-
defaultCfg.(*Config).Endpoint = "https://opensearch.example.com:9200"
27+
sampleEndpoint := "https://opensearch.example.com:9200"
28+
sampleCfg := withDefaultConfig(func(config *Config) {
29+
config.Endpoint = sampleEndpoint
30+
})
2931
maxIdleConns := 100
3032
idleConnTimeout := 90 * time.Second
3133

@@ -36,7 +38,7 @@ func TestLoadConfig(t *testing.T) {
3638
}{
3739
{
3840
id: component.NewIDWithName(typeStr, ""),
39-
expected: defaultCfg,
41+
expected: sampleCfg,
4042
configValidateAssert: assert.NoError,
4143
},
4244
{
@@ -45,7 +47,7 @@ func TestLoadConfig(t *testing.T) {
4547
Dataset: "ngnix",
4648
Namespace: "eu",
4749
HTTPClientSettings: confighttp.HTTPClientSettings{
48-
Endpoint: "https://opensearch.example.com:9200",
50+
Endpoint: sampleEndpoint,
4951
Timeout: 2 * time.Minute,
5052
Headers: map[string]configopaque.String{
5153
"myheader": "test",
@@ -65,6 +67,28 @@ func TestLoadConfig(t *testing.T) {
6567
},
6668
configValidateAssert: assert.NoError,
6769
},
70+
{
71+
id: component.NewIDWithName(typeStr, "empty_dataset"),
72+
expected: withDefaultConfig(func(config *Config) {
73+
config.Endpoint = sampleEndpoint
74+
config.Dataset = ""
75+
config.Namespace = "eu"
76+
}),
77+
configValidateAssert: func(t assert.TestingT, err error, i ...interface{}) bool {
78+
return assert.ErrorContains(t, err, errDatasetNoValue.Error())
79+
},
80+
},
81+
{
82+
id: component.NewIDWithName(typeStr, "empty_namespace"),
83+
expected: withDefaultConfig(func(config *Config) {
84+
config.Endpoint = sampleEndpoint
85+
config.Dataset = "ngnix"
86+
config.Namespace = ""
87+
}),
88+
configValidateAssert: func(t assert.TestingT, err error, i ...interface{}) bool {
89+
return assert.ErrorContains(t, err, errNamespaceNoValue.Error())
90+
},
91+
},
6892
}
6993

7094
for _, tt := range tests {
@@ -82,3 +106,13 @@ func TestLoadConfig(t *testing.T) {
82106
})
83107
}
84108
}
109+
110+
// withDefaultConfig create a new default configuration
111+
// and applies provided functions to it.
112+
func withDefaultConfig(fns ...func(*Config)) *Config {
113+
cfg := newDefaultConfig().(*Config)
114+
for _, fn := range fns {
115+
fn(cfg)
116+
}
117+
return cfg
118+
}

exporter/opensearchexporter/factory.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import (
88

99
"go.opentelemetry.io/collector/component"
1010
"go.opentelemetry.io/collector/config/confighttp"
11+
"go.opentelemetry.io/collector/consumer"
1112
"go.opentelemetry.io/collector/exporter"
1213
"go.opentelemetry.io/collector/exporter/exporterhelper"
13-
"go.opentelemetry.io/collector/pdata/ptrace"
1414
)
1515

1616
const (
@@ -32,20 +32,25 @@ func NewFactory() exporter.Factory {
3232
func newDefaultConfig() component.Config {
3333
return &Config{
3434
HTTPClientSettings: confighttp.NewDefaultHTTPClientSettings(),
35-
Namespace: "namespace",
36-
Dataset: "default",
35+
Namespace: defaultNamespace,
36+
Dataset: defaultDataset,
3737
RetrySettings: exporterhelper.NewDefaultRetrySettings(),
3838
}
3939
}
4040

4141
func createTracesExporter(ctx context.Context,
4242
set exporter.CreateSettings,
4343
cfg component.Config) (exporter.Traces, error) {
44+
c := cfg.(*Config)
45+
te, e := newSSOTracesExporter(c, set)
46+
if e != nil {
47+
return nil, e
48+
}
4449

45-
return exporterhelper.NewTracesExporter(ctx, set, cfg, func(ctx context.Context, ld ptrace.Traces) error {
46-
return nil
47-
},
48-
exporterhelper.WithShutdown(func(ctx context.Context) error {
49-
return nil
50-
}))
50+
return exporterhelper.NewTracesExporter(ctx, set, cfg,
51+
te.pushTraceData,
52+
exporterhelper.WithStart(te.Start),
53+
exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}),
54+
exporterhelper.WithRetry(c.RetrySettings),
55+
exporterhelper.WithTimeout(c.TimeoutSettings))
5156
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package opensearchexporter
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
"go.opentelemetry.io/collector/component/componenttest"
13+
"go.opentelemetry.io/collector/exporter/exportertest"
14+
)
15+
16+
func TestCreateDefaultConfig(t *testing.T) {
17+
factory := NewFactory()
18+
cfg := factory.CreateDefaultConfig()
19+
assert.NotNil(t, cfg, "failed to create default config")
20+
assert.NoError(t, componenttest.CheckConfigStruct(cfg))
21+
}
22+
23+
func TestFactory_CreateMetricsExporter_Fail(t *testing.T) {
24+
factory := NewFactory()
25+
cfg := factory.CreateDefaultConfig()
26+
params := exportertest.NewNopCreateSettings()
27+
_, err := factory.CreateMetricsExporter(context.Background(), params, cfg)
28+
require.Error(t, err, "expected an error when creating a traces exporter")
29+
}
30+
31+
func TestFactory_CreateTracesExporter_Fail(t *testing.T) {
32+
factory := NewFactory()
33+
cfg := factory.CreateDefaultConfig()
34+
params := exportertest.NewNopCreateSettings()
35+
_, err := factory.CreateTracesExporter(context.Background(), params, cfg)
36+
require.Error(t, err, "expected an error when creating a traces exporter")
37+
}
38+
39+
func TestFactory_CreateTracesExporter(t *testing.T) {
40+
factory := NewFactory()
41+
cfg := withDefaultConfig(func(cfg *Config) {
42+
cfg.Endpoint = "https://opensearch.example.com:9200"
43+
})
44+
params := exportertest.NewNopCreateSettings()
45+
exporter, err := factory.CreateTracesExporter(context.Background(), params, cfg)
46+
require.NoError(t, err)
47+
require.NotNil(t, exporter)
48+
49+
require.NoError(t, exporter.Shutdown(context.TODO()))
50+
}

exporter/opensearchexporter/go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opense
33
go 1.20
44

55
require (
6+
github.com/opensearch-project/opensearch-go/v2 v2.3.0
67
github.com/stretchr/testify v1.8.4
78
go.opentelemetry.io/collector/component v0.83.0
89
go.opentelemetry.io/collector/config/configauth v0.83.0
910
go.opentelemetry.io/collector/config/confighttp v0.83.0
1011
go.opentelemetry.io/collector/config/configopaque v0.83.0
1112
go.opentelemetry.io/collector/confmap v0.83.0
13+
go.opentelemetry.io/collector/consumer v0.83.0
1214
go.opentelemetry.io/collector/exporter v0.83.0
1315
go.opentelemetry.io/collector/pdata v1.0.0-rcv0014
16+
go.uber.org/multierr v1.11.0
17+
go.uber.org/zap v1.25.0
18+
gopkg.in/yaml.v3 v3.0.1
1419
)
1520

1621
require (
@@ -40,7 +45,6 @@ require (
4045
go.opentelemetry.io/collector/config/configtelemetry v0.83.0 // indirect
4146
go.opentelemetry.io/collector/config/configtls v0.83.0 // indirect
4247
go.opentelemetry.io/collector/config/internal v0.83.0 // indirect
43-
go.opentelemetry.io/collector/consumer v0.83.0 // indirect
4448
go.opentelemetry.io/collector/extension v0.83.0 // indirect
4549
go.opentelemetry.io/collector/extension/auth v0.83.0 // indirect
4650
go.opentelemetry.io/collector/featuregate v1.0.0-rcv0014 // indirect
@@ -50,13 +54,10 @@ require (
5054
go.opentelemetry.io/otel v1.16.0 // indirect
5155
go.opentelemetry.io/otel/metric v1.16.0 // indirect
5256
go.opentelemetry.io/otel/trace v1.16.0 // indirect
53-
go.uber.org/multierr v1.11.0 // indirect
54-
go.uber.org/zap v1.25.0 // indirect
5557
golang.org/x/net v0.14.0 // indirect
5658
golang.org/x/sys v0.11.0 // indirect
5759
golang.org/x/text v0.12.0 // indirect
5860
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
5961
google.golang.org/grpc v1.57.0 // indirect
6062
google.golang.org/protobuf v1.31.0 // indirect
61-
gopkg.in/yaml.v3 v3.0.1 // indirect
6263
)

0 commit comments

Comments
 (0)