Skip to content

Commit 3f024eb

Browse files
JimChenWYUjimchen
and
jimchen
authored
添加优维定制化主机信息指标 (#3)
Co-authored-by: jimchen <[email protected]>
1 parent ab7f062 commit 3f024eb

14 files changed

+956
-0
lines changed

receiver/hostmetricsreceiver/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ The available scrapers are:
3939
| Scraper | Supported OSs | Description |
4040
| ------------ | ---------------------------- | ------------------------------------------------------ |
4141
| [cpu] | All except Mac<sup>[1]</sup> | CPU utilization metrics |
42+
| [info] | All | easyops host info |
4243
| [disk] | All except Mac<sup>[1]</sup> | Disk I/O metrics |
4344
| [load] | All | CPU load metrics |
4445
| [filesystem] | All | File System utilization metrics |
@@ -49,6 +50,7 @@ The available scrapers are:
4950
| [process] | Linux, Windows, Mac | Per process CPU, Memory, and Disk I/O metrics |
5051

5152
[cpu]: ./internal/scraper/cpuscraper/documentation.md
53+
[info]: ./internal/scraper/infoscraper/documentation.md
5254
[disk]: ./internal/scraper/diskscraper/documentation.md
5355
[filesystem]: ./internal/scraper/filesystemscraper/documentation.md
5456
[load]: ./internal/scraper/loadscraper/documentation.md
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package infoscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper"
5+
6+
import (
7+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
8+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper/internal/metadata"
9+
)
10+
11+
// Config relating to Load Metric Scraper.
12+
type Config struct {
13+
metadata.MetricsBuilderConfig `mapstructure:",squash"`
14+
internal.ScraperConfig
15+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
//go:build !windows
5+
// +build !windows
6+
7+
//go:generate mdatagen metadata.yaml
8+
9+
package infoscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper"
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
[comment]: <> (Code generated by mdatagen. DO NOT EDIT.)
2+
3+
# hostmetricsreceiver/info
4+
5+
## Default Metrics
6+
7+
The following metrics are emitted by default. Each of them can be disabled by applying the following configuration:
8+
9+
```yaml
10+
metrics:
11+
<metric_name>:
12+
enabled: false
13+
```
14+
15+
### info.now
16+
17+
unix timestamp.
18+
19+
| Unit | Metric Type | Value Type |
20+
| ---- | ----------- | ---------- |
21+
| 1 | Gauge | Double |
22+
23+
## Resource Attributes
24+
25+
| Name | Description | Values | Enabled |
26+
| ---- | ----------- | ------ | ------- |
27+
| info.cpuNum | cpu num. | Any Int | true |
28+
| info.hostname | hostname. | Any Str | true |
29+
| info.org | common org. | Any Str | true |
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package infoscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper"
5+
6+
import (
7+
"context"
8+
9+
"go.opentelemetry.io/collector/receiver"
10+
"go.opentelemetry.io/collector/receiver/scraperhelper"
11+
12+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
13+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper/internal/metadata"
14+
)
15+
16+
// This file implements Factory for Load scraper.
17+
18+
const (
19+
// TypeStr the value of "type" key in configuration.
20+
TypeStr = "info"
21+
)
22+
23+
// Factory is the Factory for scraper.
24+
type Factory struct {
25+
}
26+
27+
// CreateDefaultConfig creates the default configuration for the Scraper.
28+
func (f *Factory) CreateDefaultConfig() internal.Config {
29+
return &Config{
30+
MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
31+
}
32+
}
33+
34+
// CreateMetricsScraper creates a scraper based on provided config.
35+
func (f *Factory) CreateMetricsScraper(
36+
ctx context.Context,
37+
settings receiver.CreateSettings,
38+
config internal.Config,
39+
) (scraperhelper.Scraper, error) {
40+
cfg := config.(*Config)
41+
s := newInfoScraper(ctx, settings, cfg)
42+
43+
return scraperhelper.NewScraper(
44+
TypeStr,
45+
s.scrape,
46+
scraperhelper.WithStart(s.start),
47+
scraperhelper.WithShutdown(s.shutdown),
48+
)
49+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package infoscraper
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
11+
"github.com/stretchr/testify/assert"
12+
"go.opentelemetry.io/collector/receiver"
13+
)
14+
15+
func TestFactory_CreateDefaultConfig(t *testing.T) {
16+
tests := []struct {
17+
name string
18+
f *Factory
19+
want internal.Config
20+
}{
21+
{
22+
f: &Factory{},
23+
want: &Config{},
24+
},
25+
}
26+
for _, tt := range tests {
27+
t.Run(tt.name, func(t *testing.T) {
28+
got := tt.f.CreateDefaultConfig()
29+
assert.IsType(t, got, tt.want)
30+
})
31+
}
32+
}
33+
34+
func TestFactory_CreateMetricsScraper(t *testing.T) {
35+
type args struct {
36+
settings receiver.CreateSettings
37+
config internal.Config
38+
}
39+
tests := []struct {
40+
name string
41+
f *Factory
42+
args args
43+
wantErr bool
44+
}{
45+
{
46+
f: &Factory{},
47+
args: args{
48+
settings: receiver.CreateSettings{},
49+
config: &Config{},
50+
},
51+
wantErr: false,
52+
},
53+
}
54+
for _, tt := range tests {
55+
t.Run(tt.name, func(t *testing.T) {
56+
got, err := tt.f.CreateMetricsScraper(context.Background(), tt.args.settings, tt.args.config)
57+
if (err != nil) != tt.wantErr {
58+
t.Errorf("Factory.CreateMetricsScraper() error = %v, wantErr %v", err, tt.wantErr)
59+
return
60+
}
61+
assert.NotNil(t, got)
62+
})
63+
}
64+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// TODO: support windows
2+
package infoscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper"
3+
4+
import (
5+
"context"
6+
"os"
7+
"runtime"
8+
"time"
9+
10+
"github.com/shirou/gopsutil/v3/host"
11+
"go.opentelemetry.io/collector/component"
12+
"go.opentelemetry.io/collector/pdata/pcommon"
13+
"go.opentelemetry.io/collector/pdata/pmetric"
14+
"go.opentelemetry.io/collector/receiver"
15+
"go.opentelemetry.io/collector/receiver/scrapererror"
16+
17+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/infoscraper/internal/metadata"
18+
)
19+
20+
const metricsLen = 1
21+
22+
// scraper for Load Metrics
23+
type scraper struct {
24+
settings receiver.CreateSettings
25+
config *Config
26+
mb *metadata.MetricsBuilder
27+
28+
hostname func() (name string, err error)
29+
now func() time.Time
30+
cpuNum func() int
31+
org func() string
32+
// for mocking
33+
bootTime func() (uint64, error)
34+
}
35+
36+
func newInfoScraper(_ context.Context, settings receiver.CreateSettings, cfg *Config) *scraper {
37+
return &scraper{
38+
settings: settings,
39+
config: cfg,
40+
41+
now: time.Now,
42+
hostname: os.Hostname,
43+
cpuNum: runtime.NumCPU,
44+
org: org,
45+
46+
bootTime: host.BootTime,
47+
}
48+
}
49+
50+
func (s *scraper) start(ctx context.Context, _ component.Host) error {
51+
bootTime, err := s.bootTime()
52+
if err != nil {
53+
return err
54+
}
55+
56+
s.mb = metadata.NewMetricsBuilder(s.config.MetricsBuilderConfig, s.settings, metadata.WithStartTime(pcommon.Timestamp(bootTime*1e9)))
57+
return nil
58+
}
59+
60+
// shutdown
61+
func (s *scraper) shutdown(ctx context.Context) error {
62+
return nil
63+
}
64+
65+
// scrape
66+
func (s *scraper) scrape(_ context.Context) (pmetric.Metrics, error) {
67+
now := pcommon.NewTimestampFromTime(s.now())
68+
s.mb.RecordInfoNowDataPoint(now, float64(now.AsTime().Unix()))
69+
70+
hostname, err := s.hostname()
71+
if err != nil {
72+
return pmetric.NewMetrics(), scrapererror.NewPartialScrapeError(err, metricsLen)
73+
}
74+
return s.mb.Emit(
75+
metadata.WithInfoOrg(org()),
76+
metadata.WithInfoCPUNum(int64(s.cpuNum())),
77+
metadata.WithInfoHostname(hostname),
78+
), nil
79+
}
80+
81+
func org() string {
82+
return os.Getenv("EASY_ENV_COMMON_ORG")
83+
}

0 commit comments

Comments
 (0)