Skip to content

Commit

Permalink
Merge pull request #24 from t00mas/t00mas/component/exporter
Browse files Browse the repository at this point in the history
Faro Exporter structure
  • Loading branch information
mar4uk authored Dec 9, 2024
2 parents 713b319 + 899b9c6 commit ae0605c
Show file tree
Hide file tree
Showing 12 changed files with 547 additions and 0 deletions.
24 changes: 24 additions & 0 deletions pkg/exporter/faro/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Faro Exporter

## Schema supported

This exporter targets to support the Faro OpenAPI schema in JSON format, as defined in github.com/grafana/faro

## Exporter Configuration

The following exporter configuration parameters are supported.

| Name | Description | Default |
|:-----------|:-------------------------------------------|-------------|
| `endpoint` | Target endpoint that accepts Faro payloads | |


# Example Configuration

Following example configuration defines to send Faro payload to endpoint https://faro.example.com/collect

```yaml
exporters:
faro:
endpoint: 'https://faro.example.com/collect'
```
27 changes: 27 additions & 0 deletions pkg/exporter/faro/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: Apache-2.0

package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro"

import (
"errors"

"go.uber.org/multierr"
)

// FaroExporterConfig contains the configuration options for the faro exporter
type FaroExporterConfig struct {
Endpoint string `mapstructure:"endpoint"`
}

// Config contains the main configuration options for the faro exporter
type Config struct {
FaroExporter FaroExporterConfig `mapstructure:"faroexporter"`
}

func (c *Config) Validate() error {
var errs error
if c.FaroExporter.Endpoint == "" {
errs = multierr.Append(errs, errors.New("endpoint is required"))
}
return errs
}
55 changes: 55 additions & 0 deletions pkg/exporter/faro/exporter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// SPDX-License-Identifier: Apache-2.0

package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro"

import (
"context"

farotranslator "github.com/grafana/faro/pkg/translator/faro"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.uber.org/zap"
)

type faroExporter struct {
config *Config
translator farotranslator.Translator
client FaroClient
logger *zap.Logger
}

func newFaroExporter(config *Config, params exporter.Settings) *faroExporter {
faroExporter := &faroExporter{
config: config,
translator: &farotranslator.FaroTranslator{},
logger: params.Logger,
}
return faroExporter
}

func (fe *faroExporter) start(_ context.Context, host component.Host) error {
return nil
}

func (fe *faroExporter) Capabilities() consumer.Capabilities {
return consumer.Capabilities{MutatesData: false}
}

func (fe *faroExporter) ConsumeLogs(ctx context.Context, logs plog.Logs) error {
flogs, err := fe.translator.TranslateLogs(ctx, logs)
if err != nil {
return err
}
return fe.client.SendLogs(flogs)
}

func (fe *faroExporter) ConsumeTraces(ctx context.Context, traces ptrace.Traces) error {
ftraces, err := fe.translator.TranslateTraces(ctx, traces)
if err != nil {
return err
}
return fe.client.SendTraces(ftraces)
}
43 changes: 43 additions & 0 deletions pkg/exporter/faro/factory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// SPDX-License-Identifier: Apache-2.0

package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro"

import (
"context"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/exporterhelper"

"github.com/grafana/faro/pkg/exporter/faro/internal/metadata"
)

// NewFactory creates a factory for Faro exporter.
func NewFactory() exporter.Factory {
return exporter.NewFactory(
metadata.Type,
createDefaultConfig,
exporter.WithTraces(createTracesExporter, metadata.TracesStability),
exporter.WithLogs(createLogsExporter, metadata.LogsStability),
)
}

func createDefaultConfig() component.Config {
return &Config{
FaroExporter: FaroExporterConfig{
Endpoint: "",
},
}
}

func createLogsExporter(ctx context.Context, params exporter.Settings, config component.Config) (exporter.Logs, error) {
faroExporter := newFaroExporter(config.(*Config), params)

return exporterhelper.NewLogs(ctx, params, config, faroExporter.ConsumeLogs, exporterhelper.WithStart(faroExporter.start))
}

func createTracesExporter(ctx context.Context, params exporter.Settings, config component.Config) (exporter.Traces, error) {
faroExporter := newFaroExporter(config.(*Config), params)

return exporterhelper.NewTraces(ctx, params, config, faroExporter.ConsumeTraces, exporterhelper.WithStart(faroExporter.start))
}
45 changes: 45 additions & 0 deletions pkg/exporter/faro/faro_client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// SPDX-License-Identifier: Apache-2.0

package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro"

import (
faro "github.com/grafana/faro/pkg/go"
)

type FaroClient interface {
SendPayload(payload faro.Payload) error
SendMeasurements(m []faro.Measurement) error
SendLogs(l []faro.Log) error
SendTraces(t faro.Traces) error
}

func newFaroClient() *faroClient {
return &faroClient{}
}

type faroClient struct{}

func (fc *faroClient) SendPayload(payload faro.Payload) error {
return nil
}

func (fc *faroClient) SendMeasurement(ms []faro.Measurement) error {
p := faro.Payload{
Measurements: ms,
}
return fc.SendPayload(p)
}

func (fc *faroClient) SendLog(ls []faro.Log) error {
p := faro.Payload{
Logs: ls,
}
return fc.SendPayload(p)
}

func (fc *faroClient) SendTraces(t faro.Traces) error {
p := faro.Payload{
Traces: &t,
}
return fc.SendPayload(p)
}
50 changes: 50 additions & 0 deletions pkg/exporter/faro/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
module github.com/grafana/faro/pkg/exporter/faro

go 1.23.3

require (
github.com/grafana/faro/pkg/go v0.0.0-20241118134905-713b31945e4d
github.com/grafana/faro/pkg/translator/faro v0.0.0-00010101000000-000000000000
go.opentelemetry.io/collector/component v0.114.0
go.opentelemetry.io/collector/consumer v0.114.0
go.opentelemetry.io/collector/exporter v0.114.0
go.opentelemetry.io/collector/pdata v1.20.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
)

require (
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/oapi-codegen/runtime v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/stretchr/testify v1.9.0 // indirect
go.opentelemetry.io/collector/config/configretry v1.20.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.114.0 // indirect
go.opentelemetry.io/collector/consumer/consumererror v0.114.0 // indirect
go.opentelemetry.io/collector/extension v0.114.0 // indirect
go.opentelemetry.io/collector/extension/experimental/storage v0.114.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.114.0 // indirect
go.opentelemetry.io/collector/pipeline v0.114.0 // indirect
go.opentelemetry.io/otel v1.32.0 // indirect
go.opentelemetry.io/otel/metric v1.32.0 // indirect
go.opentelemetry.io/otel/sdk v1.32.0 // indirect
go.opentelemetry.io/otel/trace v1.32.0 // indirect
golang.org/x/net v0.31.0 // indirect
golang.org/x/sys v0.27.0 // indirect
golang.org/x/text v0.20.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect
google.golang.org/grpc v1.67.1 // indirect
google.golang.org/protobuf v1.35.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

replace github.com/grafana/faro/pkg/translator/faro => ../../translator/faro
Loading

0 comments on commit ae0605c

Please sign in to comment.