Skip to content

Commit eb1b495

Browse files
atoulmesbylica-splunk
authored andcommitted
[receiver/ntp] add initial implementation (open-telemetry#35850)
#### Description Adds initial implementation of ntpreceiver. <!-- Issue number (e.g. open-telemetry#1234) or full URL to issue, if applicable. --> #### Link to tracking issue open-telemetry#34375
1 parent 40fdf93 commit eb1b495

File tree

12 files changed

+233
-15
lines changed

12 files changed

+233
-15
lines changed

receiver/ntpreceiver/config.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
package ntpreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/ntpreceiver"
55

66
import (
7+
"errors"
8+
"fmt"
9+
"net"
10+
"time"
11+
712
"go.opentelemetry.io/collector/receiver/scraperhelper"
813

914
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/ntpreceiver/internal/metadata"
@@ -13,5 +18,19 @@ import (
1318
type Config struct {
1419
scraperhelper.ControllerConfig `mapstructure:",squash"`
1520
metadata.MetricsBuilderConfig `mapstructure:",squash"`
21+
Version int `mapstructure:"version"`
1622
Endpoint string `mapstructure:"endpoint"`
1723
}
24+
25+
func (c *Config) Validate() error {
26+
var errs []error
27+
_, _, err := net.SplitHostPort(c.Endpoint)
28+
if err != nil {
29+
errs = append(errs, err)
30+
}
31+
// respect terms of service https://www.pool.ntp.org/tos.html
32+
if c.ControllerConfig.CollectionInterval < 30*time.Minute {
33+
errs = append(errs, fmt.Errorf("collection interval %v is less than minimum 30m", c.ControllerConfig.CollectionInterval))
34+
}
35+
return errors.Join(errs...)
36+
}

receiver/ntpreceiver/config_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package ntpreceiver
5+
6+
import (
7+
"testing"
8+
"time"
9+
10+
"github.com/stretchr/testify/require"
11+
"go.opentelemetry.io/collector/receiver/scraperhelper"
12+
)
13+
14+
func TestValidate(t *testing.T) {
15+
for _, tt := range []struct {
16+
name string
17+
c *Config
18+
errorExpected string
19+
}{
20+
{
21+
name: "no host",
22+
c: &Config{
23+
Version: 4,
24+
Endpoint: "",
25+
ControllerConfig: scraperhelper.ControllerConfig{CollectionInterval: 45 * time.Minute},
26+
},
27+
errorExpected: "missing port in address",
28+
},
29+
{
30+
name: "no port",
31+
c: &Config{
32+
Version: 4,
33+
Endpoint: "pool.ntp.org",
34+
ControllerConfig: scraperhelper.ControllerConfig{CollectionInterval: 45 * time.Minute},
35+
},
36+
errorExpected: "address pool.ntp.org: missing port in address",
37+
},
38+
{
39+
name: "valid",
40+
c: &Config{
41+
Version: 4,
42+
Endpoint: "pool.ntp.org:123",
43+
ControllerConfig: scraperhelper.ControllerConfig{CollectionInterval: 45 * time.Minute},
44+
},
45+
},
46+
{
47+
name: "interval too small",
48+
c: &Config{
49+
Version: 4,
50+
Endpoint: "pool.ntp.org:123",
51+
ControllerConfig: scraperhelper.ControllerConfig{CollectionInterval: 29 * time.Minute},
52+
},
53+
errorExpected: "collection interval 29m0s is less than minimum 30m",
54+
},
55+
} {
56+
t.Run(tt.name, func(t *testing.T) {
57+
err := tt.c.Validate()
58+
if tt.errorExpected == "" {
59+
require.NoError(t, err)
60+
} else {
61+
require.EqualError(t, err, tt.errorExpected)
62+
}
63+
})
64+
}
65+
}

receiver/ntpreceiver/documentation.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ metrics:
1414
1515
### ntp.offset
1616
17-
Time difference between local and NTP server clocks in seconds.
17+
Time difference between local and NTP server clocks
1818
1919
| Unit | Metric Type | Value Type |
2020
| ---- | ----------- | ---------- |
21-
| s | Gauge | Int |
21+
| ns | Gauge | Int |
2222
2323
## Resource Attributes
2424

receiver/ntpreceiver/factory.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package ntpreceiver // import "github.com/open-telemetry/opentelemetry-collector
55

66
import (
77
"context"
8+
"time"
89

910
"go.opentelemetry.io/collector/component"
1011
"go.opentelemetry.io/collector/consumer"
@@ -23,12 +24,29 @@ func NewFactory() receiver.Factory {
2324
}
2425

2526
func createDefaultConfig() component.Config {
27+
scraperConfig := scraperhelper.NewDefaultControllerConfig()
28+
scraperConfig.CollectionInterval = 30 * time.Minute
2629
return &Config{
27-
ControllerConfig: scraperhelper.NewDefaultControllerConfig(),
30+
ControllerConfig: scraperConfig,
2831
MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
32+
Version: 4,
33+
Endpoint: "pool.ntp.org:123",
2934
}
3035
}
3136

32-
func createMetricsReceiver(_ context.Context, _ receiver.Settings, _ component.Config, _ consumer.Metrics) (receiver.Metrics, error) {
33-
return nil, nil
37+
func createMetricsReceiver(_ context.Context, settings receiver.Settings, cfg component.Config, consumer consumer.Metrics) (receiver.Metrics, error) {
38+
rCfg := cfg.(*Config)
39+
mp := newScraper(rCfg, settings)
40+
s, err := scraperhelper.NewScraper(metadata.Type, mp.scrape)
41+
if err != nil {
42+
return nil, err
43+
}
44+
opt := scraperhelper.AddScraper(s)
45+
46+
return scraperhelper.NewScraperControllerReceiver(
47+
&rCfg.ControllerConfig,
48+
settings,
49+
consumer,
50+
opt,
51+
)
3452
}

receiver/ntpreceiver/factory_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package ntpreceiver
5+
6+
import (
7+
"testing"
8+
"time"
9+
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func TestCreateDefaultConfig(t *testing.T) {
14+
c := createDefaultConfig().(*Config)
15+
require.Equal(t, 4, c.Version)
16+
require.Equal(t, "pool.ntp.org:123", c.Endpoint)
17+
require.Equal(t, 30*time.Minute, c.CollectionInterval)
18+
}

receiver/ntpreceiver/generated_component_test.go

Lines changed: 51 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/ntpreceiver/go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/ntprec
33
go 1.22.0
44

55
require (
6+
github.com/beevik/ntp v1.4.3
67
github.com/google/go-cmp v0.6.0
78
github.com/stretchr/testify v1.9.0
89
go.opentelemetry.io/collector/component v0.111.1-0.20241008154146-ea48c09c31ae
910
go.opentelemetry.io/collector/confmap v1.17.1-0.20241008154146-ea48c09c31ae
1011
go.opentelemetry.io/collector/consumer v0.111.1-0.20241008154146-ea48c09c31ae
12+
go.opentelemetry.io/collector/consumer/consumertest v0.111.1-0.20241008154146-ea48c09c31ae
1113
go.opentelemetry.io/collector/filter v0.111.1-0.20241008154146-ea48c09c31ae
1214
go.opentelemetry.io/collector/pdata v1.17.1-0.20241008154146-ea48c09c31ae
1315
go.opentelemetry.io/collector/receiver v0.111.1-0.20241008154146-ea48c09c31ae
@@ -34,7 +36,6 @@ require (
3436
github.com/rogpeppe/go-internal v1.12.0 // indirect
3537
go.opentelemetry.io/collector/config/configtelemetry v0.111.1-0.20241008154146-ea48c09c31ae // indirect
3638
go.opentelemetry.io/collector/consumer/consumerprofiles v0.111.1-0.20241008154146-ea48c09c31ae // indirect
37-
go.opentelemetry.io/collector/consumer/consumertest v0.111.1-0.20241008154146-ea48c09c31ae // indirect
3839
go.opentelemetry.io/collector/internal/globalsignal v0.111.1-0.20241008154146-ea48c09c31ae // indirect
3940
go.opentelemetry.io/collector/pdata/pprofile v0.111.1-0.20241008154146-ea48c09c31ae // indirect
4041
go.opentelemetry.io/collector/pipeline v0.111.1-0.20241008154146-ea48c09c31ae // indirect

receiver/ntpreceiver/go.sum

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/ntpreceiver/internal/metadata/generated_metrics.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/ntpreceiver/internal/metadata/generated_metrics_test.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)