Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "components" Command #6322

Merged
merged 25 commits into from
Nov 28, 2022
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f0c3ead
Created a fix for #4671
Chinwendu20 Oct 15, 2022
f459bbc
Added unit test and file in chloggen
Chinwendu20 Oct 18, 2022
2ce77ed
Merge branch 'main' into build-info-flag
Chinwendu20 Oct 18, 2022
37eb34d
Update service/flags.go
Chinwendu20 Oct 19, 2022
363bca9
Remove whitespace
Chinwendu20 Oct 19, 2022
8cd528a
Added build info sub command
Chinwendu20 Oct 20, 2022
72da9b6
fix merge conflict
Chinwendu20 Oct 20, 2022
03fa3d5
Added test
Chinwendu20 Oct 20, 2022
df35afd
Added comments in test
Chinwendu20 Oct 20, 2022
560d5c1
Fixed CI errors
Chinwendu20 Oct 21, 2022
0084318
Separated new command test in separate file
Chinwendu20 Oct 25, 2022
cd495bf
Update service/README.md
codeboten Oct 26, 2022
6f9c455
Update service/command_build_info.go
codeboten Oct 26, 2022
80551fd
Corrected wrong values chlog file
Chinwendu20 Oct 27, 2022
3b69252
Apply suggestions from code review
codeboten Oct 27, 2022
cfc13a2
Merge branch 'build-info-flag' of https://github.com/Chinwendu20/open…
Chinwendu20 Oct 28, 2022
76b26e9
Added license
Chinwendu20 Nov 5, 2022
b6583e4
Changed command name to components
Chinwendu20 Nov 5, 2022
6a3cbe1
vanity import
Chinwendu20 Nov 7, 2022
c9be8b7
Merge branch 'main' into build-info-flag
Chinwendu20 Nov 8, 2022
42ae192
Repalced deprecated config.Type with component.Type
Chinwendu20 Nov 8, 2022
75cd2e4
Fixed build info test
Chinwendu20 Nov 17, 2022
bcd3003
use cmd.OutOrStdout for output, makes testing easier
Nov 21, 2022
c3aad30
Fixed lint test
Chinwendu20 Nov 22, 2022
b2bba0b
Update .chloggen/build-info-flag.yaml
codeboten Nov 25, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .chloggen/build-info-flag.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: build-info command
codeboten marked this conversation as resolved.
Show resolved Hide resolved

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Added build-info sub command which outputs components in collector distribution.
codeboten marked this conversation as resolved.
Show resolved Hide resolved

# One or more tracking issues or pull requests related to the change
issues: [#4671]
codeboten marked this conversation as resolved.
Show resolved Hide resolved

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:
1 change: 0 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@
- Add prometheus metric prefix to Collector's own telemetry when using OpenTelemetry for internal telemetry (#6223)
- `exporter/logging`: Apply consistent rendering of map values (#6244)
- Add support in the confmap.Resolver to expand embedded config URIs inside configuration. (#6276)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This shouldn't change. Please undo it if you can.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I would revert this to its initial state before my commits.

### 🧰 Bug fixes 🧰

- Fixed bug where `telemetryInitializer` is not cleaned up when `newService` errors (#6239)
Expand Down
30 changes: 29 additions & 1 deletion service/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,33 @@ For more technical details about how configuration is resolved you can read the

`./otelcorecol --config=file:examples/local/otel-config.yaml --config="yaml:exporters::logging::loglevel: info"`


# How to check components available in a distribution
codeboten marked this conversation as resolved.
Show resolved Hide resolved

Use the sub command build-info. Below is an example:

```bash
.\otelcol build-info
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the other examples use ./otelcorecol we either change that or this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would change this thanks

```
Sample output:

```yaml

version: 0.62.1-dev
receivers:
- otlp
processors:
- memory_limiter
- batch
exporters:
- logging
- otlp
- otlphttp
extensions:
- memory_ballast
- zpages

```
## How to override config properties?

The `--set` flag allows to set arbitrary config property. The `--set` values are merged into the final configuration
Expand Down Expand Up @@ -94,4 +121,5 @@ key:

1. Does not support setting a key that contains a dot `.`.
2. Does not support setting a key that contains a equal sign `=`.
3. The configuration key separator inside the value part of the property is "::". For example `--set "name={a::b: c}"` is equivalent with `--set name.a.b=c`.
3. The configuration key separator inside the value part of the property is "::". For example `--set "name={a::b: c}"` is equivalent with `--set name.a.b=c`.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What changed here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I would remove the whitespace

48 changes: 47 additions & 1 deletion service/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,58 @@ package service // import "go.opentelemetry.io/collector/service"

import (
"errors"
"fmt"

"github.com/spf13/cobra"
"gopkg.in/yaml.v3"

"go.opentelemetry.io/collector/config"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Those two imports should be together (go.opentelemetry.io/collector/...) but I think the linter will tell you that as well :-)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks I attempted putting them together but when I ran "make fmt", it sorted them back in this order

"go.opentelemetry.io/collector/featuregate"
)

type componentsOutput struct {
Version string
Receivers []config.Type
Processors []config.Type
Exporters []config.Type
Extensions []config.Type
}

// newBuildCommand constructs a new cobra.Command sub command using the given CollectorSettings.
func newBuildSubCommand(set CollectorSettings) *cobra.Command {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please extract this in its own file with tests as well.

Copy link
Contributor Author

@Chinwendu20 Chinwendu20 Oct 22, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks please I have written test for this already: https://github.com/open-telemetry/opentelemetry-collector/pull/6322/files#diff-ef234bff50b971d3085412fc8ca957dde031204f5c4591a8833611f9758cb36e. Are you saying that I should create a new file for this as well as for the test respectively?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed :) "command_build_info.go" and "command_build_info_test.go"

buildCmd := &cobra.Command{
Use: "build-info",
Short: "Outputs available components in a given collector distribution",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Short: "Outputs available components in a given collector distribution",
Short: "Outputs available components in this collector distribution",

A minor nit, but I'd rather not risk someone being confused about whether they can ask for components in distributions other than the one currently executable.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, I will be making that change

Args: cobra.ExactArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {

components := componentsOutput{}
for ext := range set.Factories.Extensions {
components.Extensions = append(components.Extensions, ext)
}
for prs := range set.Factories.Processors {
components.Processors = append(components.Processors, prs)
}
for rcv := range set.Factories.Receivers {
components.Receivers = append(components.Receivers, rcv)
}
for exp := range set.Factories.Exporters {
components.Exporters = append(components.Exporters, exp)
}
components.Version = set.BuildInfo.Version
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be nice to include the rest of the BuildInfo fields in the output.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh okay, I would be adding that, thanks.

yamlData, err := yaml.Marshal(components)
if err != nil {
return err
}
fmt.Println(string(yamlData))
return nil

},
}
return buildCmd
}

// NewCommand constructs a new cobra.Command using the given CollectorSettings.
func NewCommand(set CollectorSettings) *cobra.Command {
flagSet := flags()
Expand Down Expand Up @@ -53,7 +99,7 @@ func NewCommand(set CollectorSettings) *cobra.Command {
return col.Run(cmd.Context())
},
}

rootCmd.AddCommand(newBuildSubCommand(set))
rootCmd.Flags().AddGoFlagSet(flagSet)
return rootCmd
}
62 changes: 62 additions & 0 deletions service/command_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,18 @@
package service

import (
"bytes"
"io"
"os"
"path/filepath"
"strings"
"testing"

"gopkg.in/yaml.v3"

"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/featuregate"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

Expand Down Expand Up @@ -48,3 +57,56 @@ func TestNewCommandInvalidComponent(t *testing.T) {
cmd := NewCommand(CollectorSettings{Factories: factories, ConfigProvider: cfgProvider})
require.Error(t, cmd.Execute())
}

func TestBuildSubCommand(t *testing.T) {
factories, err := componenttest.NopFactories()
require.NoError(t, err)

cfgProvider, err := NewConfigProvider(newDefaultConfigProviderSettings([]string{filepath.Join("testdata", "otelcol-nop.yaml")}))
require.NoError(t, err)

set := CollectorSettings{
BuildInfo: component.NewDefaultBuildInfo(),
Factories: factories,
ConfigProvider: cfgProvider,
telemetry: newColTelemetry(featuregate.NewRegistry()),
}
cmd := NewCommand(set)
cmd.SetArgs([]string{"build-info"})

ExpectedYamlStruct := componentsOutput{
Version: "latest",
Receivers: []config.Type{"nop"},
Processors: []config.Type{"nop"},
Exporters: []config.Type{"nop"},
Extensions: []config.Type{"nop"},
}
ExpectedOutput, err := yaml.Marshal(ExpectedYamlStruct)
require.NoError(t, err)

// Obtaining StdOutput of cmd.Execute()
oldStdOut := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w //Write to os.StdOut

err = cmd.Execute()
require.NoError(t, err)

bufChan := make(chan string)

go func() {
var buf bytes.Buffer
_, err = io.Copy(&buf, r)
require.NoError(t, err)
bufChan <- buf.String()
}()

err = w.Close()
require.NoError(t, err)
defer func() { os.Stdout = oldStdOut }() //Restore os.Stdout to old value after test
output := <-bufChan
//Trim new line at the end of the two strings to make a better comparison as string() adds an extra new
//line that makes the test fail.
assert.Equal(t, strings.Trim(output, "\n"), strings.Trim(string(ExpectedOutput), "\n"))

}