-
Notifications
You must be signed in to change notification settings - Fork 488
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
flow: Add otelcol.receiver.vcenter component #5715
Merged
Merged
Changes from 23 commits
Commits
Show all changes
24 commits
Select commit
Hold shift + click to select a range
e3baf8e
flow: Add otelcol.receiver.vcenter component
marctc 12d8ccf
flow: Add otelcol.receiver.vcenter component
marctc ae785aa
Merge branch 'main' into add_vcenter_receiver
marctc d9fe9f9
Update docs/sources/flow/reference/components/otelcol.receiver.vcente…
marctc abfb48a
Update docs/sources/flow/reference/components/otelcol.receiver.vcente…
marctc 93fa7c2
Update docs/sources/flow/reference/components/otelcol.receiver.vcente…
marctc 5f2cf69
Update docs/sources/flow/reference/components/otelcol.receiver.vcente…
marctc c708425
Update CHANGELOG.md
marctc a346827
Update docs/sources/flow/reference/components/otelcol.receiver.vcente…
marctc 5cfef4c
Update docs/sources/flow/reference/components/otelcol.receiver.vcente…
marctc 84b75ee
Address test feedback
marctc 04be039
Merge branch 'main' into add_vcenter_receiver
marctc 6465d15
clarify docs
marctc 1de1406
fix error message
marctc a8aceca
Add component to all.go
marctc a747885
Change vsphere exporter docs
marctc 63385ea
update docs
marctc 80876f9
update docs
marctc 33a62aa
update docs
marctc cf803c9
Metrics and attributes disabled by default
ptodev ea66d8f
Enable most metrics and attributes by default./
ptodev f3ea19e
add stability level
marctc fa17b65
lint
marctc 65f7233
last tweaks
marctc File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package otelcol | ||
|
||
import ( | ||
"errors" | ||
"fmt" | ||
"time" | ||
|
||
scraperhelper "go.opentelemetry.io/collector/receiver/scraperhelper" | ||
) | ||
|
||
var ( | ||
errNonPositiveInterval = errors.New("requires positive value") | ||
errGreaterThanZero = errors.New("requires a value greater than zero") | ||
) | ||
|
||
// ScraperControllerArguments defines common settings for a scraper controller | ||
// configuration. | ||
type ScraperControllerArguments struct { | ||
CollectionInterval time.Duration `river:"collection_interval,attr,optional"` | ||
InitialDelay time.Duration `river:"initial_delay,attr,optional"` | ||
Timeout time.Duration `river:"timeout,attr,optional"` | ||
} | ||
|
||
// DefaultScraperControllerArguments holds default settings for ScraperControllerArguments. | ||
var DefaultScraperControllerArguments = ScraperControllerArguments{ | ||
CollectionInterval: time.Minute, | ||
InitialDelay: time.Second, | ||
Timeout: 0 * time.Second, | ||
} | ||
|
||
// SetToDefault implements river.Defaulter. | ||
func (args *ScraperControllerArguments) SetToDefault() { | ||
*args = DefaultScraperControllerArguments | ||
} | ||
|
||
// Convert converts args into the upstream type. | ||
func (args *ScraperControllerArguments) Convert() *scraperhelper.ScraperControllerSettings { | ||
if args == nil { | ||
return nil | ||
} | ||
|
||
return &scraperhelper.ScraperControllerSettings{ | ||
CollectionInterval: args.CollectionInterval, | ||
InitialDelay: args.InitialDelay, | ||
Timeout: args.Timeout, | ||
} | ||
} | ||
|
||
// Validate returns an error if args is invalid. | ||
func (args *ScraperControllerArguments) Validate() error { | ||
if args.CollectionInterval <= 0 { | ||
return fmt.Errorf(`"collection_interval": %w`, errNonPositiveInterval) | ||
} | ||
if args.Timeout < 0 { | ||
return fmt.Errorf(`"timeout": %w`, errGreaterThanZero) | ||
} | ||
return nil | ||
} |
Large diffs are not rendered by default.
Oops, something went wrong.
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,38 @@ | ||
package vcenter | ||
|
||
import ( | ||
"testing" | ||
"time" | ||
|
||
"github.com/grafana/river" | ||
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/vcenterreceiver" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestArguments_UnmarshalRiver(t *testing.T) { | ||
in := ` | ||
endpoint = "http://localhost:1234" | ||
username = "user" | ||
password = "pass" | ||
collection_interval = "2m" | ||
|
||
output { /* no-op */ } | ||
` | ||
|
||
var args Arguments | ||
require.NoError(t, river.Unmarshal([]byte(in), &args)) | ||
args.Convert() | ||
ext, err := args.Convert() | ||
require.NoError(t, err) | ||
otelArgs, ok := (ext).(*vcenterreceiver.Config) | ||
|
||
require.True(t, ok) | ||
|
||
require.Equal(t, "user", otelArgs.Username) | ||
require.Equal(t, "pass", string(otelArgs.Password)) | ||
require.Equal(t, "http://localhost:1234", otelArgs.Endpoint) | ||
|
||
require.Equal(t, 2*time.Minute, otelArgs.ScraperControllerSettings.CollectionInterval) | ||
require.Equal(t, time.Second, otelArgs.ScraperControllerSettings.InitialDelay) | ||
require.Equal(t, 0*time.Second, otelArgs.ScraperControllerSettings.Timeout) | ||
} |
143 changes: 143 additions & 0 deletions
143
docs/sources/flow/reference/components/otelcol.receiver.vcenter.md
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,143 @@ | ||
--- | ||
aliases: | ||
- /docs/grafana-cloud/agent/flow/reference/components/otelcol.receiver.vcenter/ | ||
- /docs/grafana-cloud/monitor-infrastructure/agent/flow/reference/components/otelcol.receiver.vcenter/ | ||
- /docs/grafana-cloud/monitor-infrastructure/integrations/agent/flow/reference/components/otelcol.receiver.vcenter/ | ||
canonical: https://grafana.com/docs/agent/latest/flow/reference/components/otelcol.receiver.vcenter/ | ||
title: otelcol.receiver.vcenter | ||
marctc marked this conversation as resolved.
Show resolved
Hide resolved
|
||
description: Learn about otelcol.receiver.vcenter | ||
labels: | ||
stage: experimental | ||
--- | ||
|
||
# otelcol.receiver.vcenter | ||
|
||
{{< docs/shared lookup="flow/stability/experimental.md" source="agent" version="<AGENT VERSION>" >}} | ||
|
||
`otelcol.receiver.vcenter` accepts metrics from a | ||
vCenter or ESXi host running VMware vSphere APIs and | ||
forwards it to other `otelcol.*` components. | ||
|
||
> **NOTE**: `otelcol.receiver.vcenter` is a wrapper over the upstream | ||
> OpenTelemetry Collector `vcenter` receiver from the `otelcol-contrib` | ||
> distribution. Bug reports or feature requests will be redirected to the | ||
> upstream repository, if necessary. | ||
|
||
Multiple `otelcol.receiver.vcenter` components can be specified by giving them | ||
different labels. | ||
|
||
The full list of metrics that can be collected can be found [here][vcenter metrics]. | ||
marctc marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
[vcenter metrics]: https://github.com/open-telemetry/opentelemetry-collector/blob/{{< param "OTEL_VERSION" >}}/receiver/vcenterreceiver/documentation.md | ||
|
||
## Prerequisites | ||
|
||
This receiver has been built to support ESXi and vCenter versions: | ||
|
||
- 7.5 | ||
- 7.0 | ||
- 6.7 | ||
|
||
A “Read Only” user assigned to a vSphere with permissions to the vCenter server, cluster and all subsequent resources being monitored must be specified in order for the receiver to retrieve information about them. | ||
|
||
## Usage | ||
|
||
```river | ||
otelcol.receiver.vcenter "LABEL" { | ||
endpoint = "VCENTER_ENDPOINT" | ||
username = "VCENTER_USERNAME" | ||
password = "VCENTER_PASSWORD" | ||
|
||
output { | ||
metrics = [...] | ||
} | ||
} | ||
``` | ||
|
||
## Arguments | ||
|
||
`otelcol.receiver.vcenter` supports the following arguments: | ||
|
||
|
||
Name | Type | Description | Default | Required | ||
---- | ---- | ----------- | ------- | -------- | ||
`endpoint` | `string` | Endpoint to a vCenter Server or ESXi host which has the SDK path enabled. | | yes | ||
`username` | `string` | Username to use for authentication. | | yes | ||
`password` | `string` | Password to use for authentication. | | yes | ||
`collection_interval` | `duration` | Defines how often to collect metrics. | `"1m"` | no | ||
`initial_delay` | `duration` | Defines how long this receiver waits before starting. | `"1s"` | no | ||
`timeout` | `duration` | Defines the timeout for the underlying HTTP client. | `"0s"` | no | ||
|
||
`endpoint` has the format `<protocol>://<hostname>`. For example, `https://vcsa.hostname.localnet`. | ||
|
||
## Blocks | ||
marctc marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
The following blocks are supported inside the definition of | ||
`otelcol.receiver.vcenter`: | ||
|
||
Hierarchy | Block | Description | Required | ||
--------- | ----- | ----------- | -------- | ||
tls | [tls][] | Configures TLS for the HTTP client. | no | ||
debug_metrics | [debug_metrics][] | Configures the metrics that this component generates to monitor its state. | no | ||
output | [output][] | Configures where to send received telemetry data. | yes | ||
|
||
[tls]: #tls-block | ||
[debug_metrics]: #debug_metrics-block | ||
[output]: #output-block | ||
|
||
### tls block | ||
|
||
The `tls` block configures TLS settings used for a server. If the `tls` block | ||
isn't provided, TLS won't be used for connections to the server. | ||
|
||
{{< docs/shared lookup="flow/reference/components/otelcol-tls-config-block.md" source="agent" version="<AGENT VERSION>" >}} | ||
|
||
### debug_metrics block | ||
|
||
{{< docs/shared lookup="flow/reference/components/otelcol-debug-metrics-block.md" source="agent" version="<AGENT VERSION>" >}} | ||
|
||
### output block | ||
|
||
{{< docs/shared lookup="flow/reference/components/output-block.md" source="agent" version="<AGENT VERSION>" >}} | ||
|
||
## Exported fields | ||
|
||
`otelcol.receiver.vcenter` does not export any fields. | ||
|
||
## Component health | ||
|
||
`otelcol.receiver.vcenter` is only reported as unhealthy if given an invalid | ||
configuration. | ||
|
||
## Debug information | ||
|
||
`otelcol.receiver.vcenter` does not expose any component-specific debug | ||
information. | ||
|
||
## Example | ||
|
||
This example forwards received telemetry data through a batch processor before | ||
finally sending it to an OTLP-capable endpoint: | ||
|
||
```river | ||
otelcol.receiver.vcenter "default" { | ||
endpoint = "http://localhost:15672" | ||
username = "otelu" | ||
password = "password" | ||
|
||
output { | ||
metrics = [otelcol.processor.batch.default.input] | ||
} | ||
} | ||
|
||
otelcol.processor.batch "default" { | ||
output { | ||
metrics = [otelcol.exporter.otlp.default.input] | ||
} | ||
} | ||
|
||
otelcol.exporter.otlp "default" { | ||
client { | ||
endpoint = env("OTLP_ENDPOINT") | ||
} | ||
} |
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
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For unmarshal tests, I personally prefer the table driven approach. It allows you to add lots of tests with minimal overhead.
For example, I'd use the
map[string]interface{}
style when some config structs are internal to OTel:https://github.com/grafana/agent/blob/main/component/otelcol/processor/span/span_test.go
If none of the config structs are internal, I'd go for specifying the OTel structs directly:
https://github.com/grafana/agent/blob/main/component/otelcol/connector/servicegraph/servicegraph_test.go