forked from open-telemetry/opentelemetry-collector-contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Carbon receiver (open-telemetry#109)
* Add Carbon receiver Add a receiver supporting the Carbon plaintext protocol over TCP or UDP. This also sets the stage to other more complex parsers that can make various transformations over metrics sent to the endpoints. * PR Feedback first round * PR feedback on transport.Client
- Loading branch information
Paulo Janotti
committed
Jan 31, 2020
1 parent
b633954
commit b64ac15
Showing
29 changed files
with
3,244 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
include ../../Makefile.Common |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// Copyright 2019, OpenTelemetry Authors | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http:https://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package carbonreceiver | ||
|
||
import ( | ||
"time" | ||
|
||
"github.com/open-telemetry/opentelemetry-collector/config/configmodels" | ||
|
||
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver/protocol" | ||
) | ||
|
||
const ( | ||
// parserConfigSection is the name that must be used for the parser settings | ||
// in the configuration struct. The metadata mapstructure for the parser | ||
// should use the same string. | ||
parserConfigSection = "parser" | ||
) | ||
|
||
// Config defines configuration for the Carbon receiver. | ||
type Config struct { | ||
configmodels.ReceiverSettings `mapstructure:",squash"` | ||
|
||
// Transport is either "tcp" or "udp". | ||
Transport string `mapstructure:"transport"` | ||
|
||
// TCPIdleTimeout is the timout for idle TCP connections, it is ignored | ||
// if transport being used is UDP. | ||
TCPIdleTimeout time.Duration `mapstructure:"tcp_idle_timeout"` | ||
|
||
// Parser specifies a parser and the respective configuration to be used | ||
// by the receiver. | ||
Parser *protocol.Config `mapstructure:"parser"` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright 2019, OpenTelemetry Authors | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http:https://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package carbonreceiver | ||
|
||
import ( | ||
"path" | ||
"testing" | ||
"time" | ||
|
||
"github.com/open-telemetry/opentelemetry-collector/config" | ||
"github.com/open-telemetry/opentelemetry-collector/config/configmodels" | ||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
|
||
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver/protocol" | ||
) | ||
|
||
func TestLoadConfig(t *testing.T) { | ||
factories, err := config.ExampleComponents() | ||
assert.Nil(t, err) | ||
|
||
factory := &Factory{} | ||
factories.Receivers[typeStr] = factory | ||
cfg, err := config.LoadConfigFile( | ||
t, path.Join(".", "testdata", "config.yaml"), factories, | ||
) | ||
|
||
require.NoError(t, err) | ||
require.NotNil(t, cfg) | ||
|
||
assert.Equal(t, len(cfg.Receivers), 2) | ||
|
||
r0 := cfg.Receivers["carbon"] | ||
assert.Equal(t, factory.CreateDefaultConfig(), r0) | ||
|
||
r1 := cfg.Receivers["carbon/allsettings"].(*Config) | ||
assert.Equal(t, | ||
&Config{ | ||
ReceiverSettings: configmodels.ReceiverSettings{ | ||
TypeVal: typeStr, | ||
NameVal: "carbon/allsettings", | ||
Endpoint: "localhost:8080", | ||
}, | ||
Transport: "udp", | ||
TCPIdleTimeout: 5 * time.Second, | ||
Parser: &protocol.Config{ | ||
Type: "delimiter", | ||
Config: &protocol.DelimiterParser{ | ||
OrDemiliter: "|", | ||
}, | ||
}, | ||
}, | ||
r1) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// Copyright 2019, OpenTelemetry Authors | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http:https://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
// Package carbonreceiver implements a receiver that can be used by the | ||
// OpenTelemetry collector to receive data in the Carbon supported formats. | ||
// Carbon is the backend used by Graphite, see | ||
// https://graphite.readthedocs.io/en/latest/carbon-daemons.html | ||
package carbonreceiver |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
// Copyright 2019, OpenTelemetry Authors | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http:https://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package carbonreceiver | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
|
||
"github.com/open-telemetry/opentelemetry-collector/config/configerror" | ||
"github.com/open-telemetry/opentelemetry-collector/config/configmodels" | ||
"github.com/open-telemetry/opentelemetry-collector/consumer" | ||
"github.com/open-telemetry/opentelemetry-collector/receiver" | ||
"github.com/spf13/viper" | ||
"go.uber.org/zap" | ||
|
||
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver/protocol" | ||
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/carbonreceiver/transport" | ||
) | ||
|
||
// This file implements factory for Carbon receiver. | ||
|
||
const ( | ||
// The value of "type" key in configuration. | ||
typeStr = "carbon" | ||
) | ||
|
||
// Factory is the factory for carbon receiver. | ||
type Factory struct { | ||
} | ||
|
||
var _ receiver.Factory = (*Factory)(nil) | ||
|
||
// Type gets the type of the Receiver config created by this factory. | ||
func (f *Factory) Type() string { | ||
return typeStr | ||
} | ||
|
||
// CustomUnmarshaler returns the custom function to handle the special settings | ||
// used on the receiver. | ||
func (f *Factory) CustomUnmarshaler() receiver.CustomUnmarshaler { | ||
return func(v *viper.Viper, viperKey string, sourceViperSection *viper.Viper, intoCfg interface{}) error { | ||
if sourceViperSection == nil { | ||
// The section is empty nothing to do, using the default config. | ||
return nil | ||
} | ||
|
||
// Unmarshal but not exact yet so the different keys under config do not | ||
// trigger errors, this is needed so that the types of protocol and transport | ||
// are read. | ||
if err := sourceViperSection.Unmarshal(intoCfg); err != nil { | ||
return err | ||
} | ||
|
||
// Unmarshal the protocol, so the type of config can be properly set. | ||
rCfg := intoCfg.(*Config) | ||
vParserCfg := sourceViperSection.Sub(parserConfigSection) | ||
if vParserCfg != nil { | ||
if err := protocol.LoadParserConfig(vParserCfg, rCfg.Parser); err != nil { | ||
return fmt.Errorf( | ||
"error on %q section for %s: %v", | ||
parserConfigSection, | ||
rCfg.Name(), | ||
err) | ||
} | ||
} | ||
|
||
// Unmarshal exact to validate the config keys. | ||
if err := sourceViperSection.UnmarshalExact(intoCfg); err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} | ||
} | ||
|
||
// CreateDefaultConfig creates the default configuration for Carbon receiver. | ||
func (f *Factory) CreateDefaultConfig() configmodels.Receiver { | ||
return &Config{ | ||
ReceiverSettings: configmodels.ReceiverSettings{ | ||
TypeVal: typeStr, | ||
NameVal: typeStr, | ||
Endpoint: "localhost:2003", | ||
}, | ||
Transport: "tcp", | ||
TCPIdleTimeout: transport.TCPIdleTimeoutDefault, | ||
Parser: &protocol.Config{ | ||
Type: "plaintext", | ||
Config: &protocol.PlaintextParser{}, | ||
}, | ||
} | ||
} | ||
|
||
// CreateTraceReceiver creates a trace receiver based on provided config. | ||
func (f *Factory) CreateTraceReceiver( | ||
ctx context.Context, | ||
logger *zap.Logger, | ||
cfg configmodels.Receiver, | ||
consumer consumer.TraceConsumer, | ||
) (receiver.TraceReceiver, error) { | ||
|
||
return nil, configerror.ErrDataTypeIsNotSupported | ||
} | ||
|
||
// CreateMetricsReceiver creates a metrics receiver based on provided config. | ||
func (f *Factory) CreateMetricsReceiver( | ||
logger *zap.Logger, | ||
cfg configmodels.Receiver, | ||
consumer consumer.MetricsConsumer, | ||
) (receiver.MetricsReceiver, error) { | ||
|
||
rCfg := cfg.(*Config) | ||
return New(logger, *rCfg, consumer) | ||
} |
Oops, something went wrong.