Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
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
1 change: 1 addition & 0 deletions .chloggen/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ components:
- receiver/hostmetrics
- receiver/httpcheck
- receiver/huaweicloudcesreceiver
- receiver/icmpcheckreceiver
- receiver/iis
- receiver/influxdb
- receiver/jaeger
Expand Down
27 changes: 27 additions & 0 deletions .chloggen/new-icmp-check-receiver.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: new_component

# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
component: receiver/icmpcheckreceiver

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: "Add initial skeleton of ICMP check receiver (README, config, factory, metadata) with In Development stability."

# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
issues: [29009]

# (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:

# If your change doesn't affect end users or the exported elements of any package,
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ receiver/hostmetricsreceiver/internal/scraper/processscraper/ @open-telemetry
receiver/hostmetricsreceiver/internal/scraper/systemscraper/ @open-telemetry/collector-contrib-approvers @dmitryax @braydonk
receiver/httpcheckreceiver/ @open-telemetry/collector-contrib-approvers @codeboten @VenuEmmadi
receiver/huaweicloudcesreceiver/ @open-telemetry/collector-contrib-approvers @heitorganzeli @narcis96 @mwear
receiver/icmpcheckreceiver/ @open-telemetry/collector-contrib-approvers @atoulme @jkoronaAtCisco
receiver/iisreceiver/ @open-telemetry/collector-contrib-approvers @ishleenk17 @Mrod1598 @pjanotti
receiver/influxdbreceiver/ @open-telemetry/collector-contrib-approvers @jacobmarble
receiver/jaegerreceiver/ @open-telemetry/collector-contrib-approvers @yurishkuro
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/beta_stability.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ body:
- receiver/hostmetrics/internal/scraper/systemscraper
- receiver/httpcheck
- receiver/huaweicloudces
- receiver/icmpcheck
- receiver/iis
- receiver/influxdb
- receiver/jaeger
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ body:
- receiver/hostmetrics/internal/scraper/systemscraper
- receiver/httpcheck
- receiver/huaweicloudces
- receiver/icmpcheck
- receiver/iis
- receiver/influxdb
- receiver/jaeger
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ body:
- receiver/hostmetrics/internal/scraper/systemscraper
- receiver/httpcheck
- receiver/huaweicloudces
- receiver/icmpcheck
- receiver/iis
- receiver/influxdb
- receiver/jaeger
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/other.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ body:
- receiver/hostmetrics/internal/scraper/systemscraper
- receiver/httpcheck
- receiver/huaweicloudces
- receiver/icmpcheck
- receiver/iis
- receiver/influxdb
- receiver/jaeger
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/unmaintained.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ body:
- receiver/hostmetrics/internal/scraper/systemscraper
- receiver/httpcheck
- receiver/huaweicloudces
- receiver/icmpcheck
- receiver/iis
- receiver/influxdb
- receiver/jaeger
Expand Down
1 change: 1 addition & 0 deletions cmd/githubgen/allowlist.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
KiranmayiB
jkoronaAtCisco
1 change: 1 addition & 0 deletions internal/tidylist/tidylist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ receiver/googlecloudspannerreceiver
receiver/haproxyreceiver
receiver/httpcheckreceiver
receiver/huaweicloudcesreceiver
receiver/icmpcheckreceiver
receiver/iisreceiver
receiver/influxdbreceiver
receiver/jmxreceiver
Expand Down
1 change: 1 addition & 0 deletions receiver/icmpcheckreceiver/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../../Makefile.Common
14 changes: 14 additions & 0 deletions receiver/icmpcheckreceiver/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# icmpcheckreceiver
<!-- status autogenerated section -->
| Status | |
| ------------- |-----------|
| Stability | [development]: metrics |
| Distributions | [] |
| Issues | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Areceiver%2Ficmpcheck%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Areceiver%2Ficmpcheck) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Areceiver%2Ficmpcheck%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Areceiver%2Ficmpcheck) |
| Code coverage | [![codecov](https://codecov.io/github/open-telemetry/opentelemetry-collector-contrib/graph/main/badge.svg?component=receiver_icmpcheckreceiver)](https://app.codecov.io/gh/open-telemetry/opentelemetry-collector-contrib/tree/main/?components%5B0%5D=receiver_icmpcheckreceiver&displayType=list) |
| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner) | [@atoulme](https://www.github.com/atoulme), [@jkoronaAtCisco](https://www.github.com/jkoronaAtCisco) |

[development]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#development
<!-- end autogenerated section -->

TODO
47 changes: 47 additions & 0 deletions receiver/icmpcheckreceiver/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package icmpcheckreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/icmpcheckreceiver"

import (
"errors"
"time"

"go.opentelemetry.io/collector/scraper/scraperhelper"
"go.uber.org/multierr"
)

var (
errMissingTarget = errors.New("must specify at least one target")
errMissingTargetHost = errors.New("target host is required")
)

type Config struct {
scraperhelper.ControllerConfig `mapstructure:",squash"`
Targets []PingTarget `mapstructure:"targets"`

// prevent unkeyed literal initialization
_ struct{}
}
type PingTarget struct {
Host string `mapstructure:"host"`
PingCount int `mapstructure:"ping_count,omitempty"`
PingTimeout time.Duration `mapstructure:"ping_timeout,omitempty"`
PingInterval time.Duration `mapstructure:"ping_interval,omitempty"`
}

func (c *Config) Validate() error {
var err error

if len(c.Targets) == 0 {
return multierr.Append(err, errMissingTarget)
}

for _, target := range c.Targets {
if target.Host == "" {
err = multierr.Append(err, errMissingTargetHost)
}
}

return err
}
83 changes: 83 additions & 0 deletions receiver/icmpcheckreceiver/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package icmpcheckreceiver

import (
"errors"
"testing"

"github.com/stretchr/testify/require"
"go.uber.org/multierr"
)

func TestConfigValidate(t *testing.T) {
tests := []struct {
name string
cfg *Config
expectedUniqueErrs []error
expectedCount int
}{
{
name: "no targets",
cfg: &Config{},
expectedUniqueErrs: []error{errMissingTarget},
expectedCount: 1,
},
{
name: "single empty address",
cfg: &Config{Targets: []PingTarget{{}}},
expectedUniqueErrs: []error{errMissingTargetHost},
expectedCount: 1,
},
{
name: "multiple empty addresses",
cfg: &Config{Targets: []PingTarget{{Host: ""}, {Host: ""}}},
expectedUniqueErrs: []error{errMissingTargetHost},
expectedCount: 2,
},
{
name: "one valid one invalid",
cfg: &Config{Targets: []PingTarget{{Host: "1.1.1.1"}, {Host: ""}}},
expectedUniqueErrs: []error{errMissingTargetHost},
expectedCount: 1,
},
{
name: "all valid",
cfg: &Config{Targets: []PingTarget{{Host: "1.1.1.1"}, {Host: "example.com"}}},
expectedUniqueErrs: []error{},
expectedCount: 0,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.cfg.Validate()
if tt.expectedCount == 0 {
require.NoError(t, err, "expected no error")
return
}
require.Error(t, err, "expected error(s)")

all := multierr.Errors(err)
require.Len(t, all, tt.expectedCount, "unexpected number of collected errors: %v", all)

// Check each expected unique error is present via errors.Is
for _, expected := range tt.expectedUniqueErrs {
require.ErrorIs(t, err, expected, "expected error not found")
}

// Also ensure no unexpected errors: each collected error must match one of expectedUniqueErrs
for _, got := range all {
found := false
for _, expected := range tt.expectedUniqueErrs {
if errors.Is(got, expected) {
found = true
break
}
}
require.True(t, found, "unexpected error returned: %v", got)
}
})
}
}
6 changes: 6 additions & 0 deletions receiver/icmpcheckreceiver/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

//go:generate mdatagen metadata.yaml

package icmpcheckreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/icmpcheckreceiver"
57 changes: 57 additions & 0 deletions receiver/icmpcheckreceiver/factory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package icmpcheckreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/icmpcheckreceiver"

import (
"context"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/scraper/scraperhelper"

"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/icmpcheckreceiver/internal/metadata"
)

func NewFactory() receiver.Factory {
return receiver.NewFactory(
metadata.Type,
createDefaultConfig,
receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability))
}

func createDefaultConfig() component.Config {
cfg := scraperhelper.NewDefaultControllerConfig()

return &Config{
ControllerConfig: cfg,
Targets: []PingTarget{},
}
}

func createMetricsReceiver(
_ context.Context,
settings receiver.Settings,
cfg component.Config,
consumer consumer.Metrics,
) (receiver.Metrics, error) {
config := cfg.(*Config)
_ = config
_ = settings
_ = consumer
return &noopMetricsReceiver{}, nil
}

// noopMetricsReceiver is a minimal receiver to satisfy component lifecycle tests.
type noopMetricsReceiver struct{}

func (r *noopMetricsReceiver) Start(_ context.Context, _ component.Host) error {
_ = r
return nil
}

func (r *noopMetricsReceiver) Shutdown(_ context.Context) error {
_ = r
return nil
}
58 changes: 58 additions & 0 deletions receiver/icmpcheckreceiver/factory_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package icmpcheckreceiver

import (
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/receiver/receivertest"

"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/icmpcheckreceiver/internal/metadata"
)

func TestNewFactory(t *testing.T) {
factory := NewFactory()
require.NotNil(t, factory)
assert.Equal(t, "icmpcheckreceiver", factory.Type().String())
}

func TestCreateDefaultConfig(t *testing.T) {
factory := NewFactory()
cfg := factory.CreateDefaultConfig()
require.NotNil(t, cfg)

config, ok := cfg.(*Config)
require.True(t, ok)
assert.Empty(t, config.Targets)
}

func TestCreateMetricsReceiver(t *testing.T) {
factory := NewFactory()
cfg := factory.CreateDefaultConfig()

// Add a device to make config valid
config := cfg.(*Config)
config.Targets = []PingTarget{
{Host: "example.com", PingCount: 5, PingTimeout: 1 * time.Second, PingInterval: 10 * time.Second},
}

set := receivertest.NewNopSettings(metadata.Type)
consumer := consumertest.NewNop()

// For skeleton, we expect a no-op receiver and no error
receiver, err := factory.CreateMetrics(t.Context(), set, cfg, consumer)
assert.NotNil(t, receiver)
assert.NoError(t, err)
}

func TestFactoryCanBeUsed(t *testing.T) {
factory := NewFactory()
err := componenttest.CheckConfigStruct(factory.CreateDefaultConfig())
require.NoError(t, err)
}
Loading
Loading