Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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: []
4 changes: 4 additions & 0 deletions .codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -712,6 +712,10 @@ component_management:
name: receiver_huaweicloudces
paths:
- receiver/huaweicloudcesreceiver/**
- component_id: receiver_icmpcheck
name: receiver_icmpcheck
paths:
- receiver/icmpcheckreceiver/**
- component_id: receiver_iis
name: receiver_iis
paths:
Expand Down
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 .github/component_labels.txt
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ receiver/hostmetricsreceiver/internal/scraper/processscraper receiver/hostmetric
receiver/hostmetricsreceiver/internal/scraper/systemscraper receiver/hostmetrics/internal/scraper/system
receiver/httpcheckreceiver receiver/httpcheck
receiver/huaweicloudcesreceiver receiver/huaweicloudces
receiver/icmpcheckreceiver receiver/icmpcheck
receiver/iisreceiver receiver/iis
receiver/influxdbreceiver receiver/influxdb
receiver/jaegerreceiver 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