Skip to content

Commit 84ee6db

Browse files
authored
Add container metrics receiver to collect CPU & Memory Usage (#1064)
1 parent 9b02bed commit 84ee6db

File tree

119 files changed

+3498
-18
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

119 files changed

+3498
-18
lines changed

.testcoverage.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ exclude:
4040
- ^test/.*$
4141
- app.go # app.go and main.go should be tested by integration tests.
4242
- main.go
43+
# ignore metadata generated files
44+
- metadata/generated_.*\.go
4345
# ignore wrappers around gopsutil
4446
- internal/datasource/host
4547
- internal/watcher/process

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ require (
7171
go.opentelemetry.io/collector/receiver/receivertest v0.124.0
7272
go.opentelemetry.io/collector/scraper v0.124.0
7373
go.opentelemetry.io/collector/scraper/scraperhelper v0.124.0
74+
go.opentelemetry.io/collector/scraper/scrapertest v0.124.0
7475
go.opentelemetry.io/otel v1.35.0
7576
go.uber.org/goleak v1.3.0
7677
go.uber.org/zap v1.27.0
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Container Metrics Receiver
2+
3+
The Container Metrics receiver generates metrics about the container scraped from the cgroup files.
4+
5+
## Configuration
6+
7+
### Receiver Config
8+
9+
The following settings are optional:
10+
- `collection_interval` (default = `10s`): This receiver collects metrics on an interval. This value must be a string readable by Golang's [time.ParseDuration](https://pkg.go.dev/time#ParseDuration). Valid time units are `ns`, `us` (or `µs`), `ms`, `s`, `m`, `h`.
11+
- `initial_delay` (default = `1s`): defines how long this receiver waits before starting.
12+
13+
Example:
14+
```yaml
15+
containermetrics:
16+
collection_interval: <duration> # default = 1m
17+
initial_delay: <duration> # default = 1s
18+
```
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Copyright (c) F5, Inc.
2+
//
3+
// This source code is licensed under the Apache License, Version 2.0 license found in the
4+
// LICENSE file in the root directory of this source tree.
5+
6+
//go:generate mdatagen metadata.yaml
7+
8+
package containermetricsreceiver
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
[comment]: <> (Code generated by mdatagen. DO NOT EDIT.)
2+
3+
# containermetrics
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+
### system.memory.usage
16+
17+
Bytes of memory in use.
18+
19+
| Unit | Metric Type | Value Type | Aggregation Temporality | Monotonic |
20+
| ---- | ----------- | ---------- | ----------------------- | --------- |
21+
| By | Sum | Int | Cumulative | false |
22+
23+
#### Attributes
24+
25+
| Name | Description | Values |
26+
| ---- | ----------- | ------ |
27+
| state | Breakdown of memory usage by type. | Str: ``buffered``, ``cached``, ``inactive``, ``free``, ``slab_reclaimable``, ``slab_unreclaimable``, ``used`` |
28+
29+
## Resource Attributes
30+
31+
| Name | Description | Values | Enabled |
32+
| ---- | ----------- | ------ | ------- |
33+
| resource.id | The resource id. | Any Str | false |
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (c) F5, Inc.
2+
//
3+
// This source code is licensed under the Apache License, Version 2.0 license found in the
4+
// LICENSE file in the root directory of this source tree.
5+
6+
package containermetricsreceiver
7+
8+
import (
9+
"context"
10+
"errors"
11+
12+
"github.com/nginx/agent/v3/internal/collector/containermetricsreceiver/internal/scraper/memoryscraper"
13+
14+
"github.com/nginx/agent/v3/internal/collector/containermetricsreceiver/internal/scraper/cpuscraper"
15+
"go.opentelemetry.io/collector/component"
16+
"go.opentelemetry.io/collector/consumer"
17+
"go.opentelemetry.io/collector/receiver"
18+
"go.opentelemetry.io/collector/scraper/scraperhelper"
19+
20+
"github.com/nginx/agent/v3/internal/collector/containermetricsreceiver/internal/config"
21+
"github.com/nginx/agent/v3/internal/collector/containermetricsreceiver/internal/metadata"
22+
)
23+
24+
// nolint: ireturn
25+
func NewFactory() receiver.Factory {
26+
return receiver.NewFactory(
27+
metadata.Type,
28+
config.CreateDefaultConfig,
29+
receiver.WithMetrics(
30+
createMetricsReceiver,
31+
metadata.MetricsStability,
32+
),
33+
)
34+
}
35+
36+
// nolint: ireturn
37+
func createMetricsReceiver(
38+
_ context.Context,
39+
params receiver.Settings,
40+
rConf component.Config,
41+
cons consumer.Metrics,
42+
) (receiver.Metrics, error) {
43+
cfg, ok := rConf.(*config.Config)
44+
if !ok {
45+
return nil, errors.New("cast to metrics receiver config failed")
46+
}
47+
48+
return scraperhelper.NewMetricsController(
49+
&cfg.ControllerConfig,
50+
params,
51+
cons,
52+
scraperhelper.AddFactoryWithConfig(cpuscraper.NewFactory(), cpuscraper.NewConfig(cfg)),
53+
scraperhelper.AddFactoryWithConfig(memoryscraper.NewFactory(), memoryscraper.NewConfig(cfg)),
54+
)
55+
}

internal/collector/containermetricsreceiver/generated_component_test.go

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

internal/collector/containermetricsreceiver/generated_package_test.go

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) F5, Inc.
2+
//
3+
// This source code is licensed under the Apache License, Version 2.0 license found in the
4+
// LICENSE file in the root directory of this source tree.
5+
6+
package config
7+
8+
import (
9+
"go.opentelemetry.io/collector/component"
10+
"go.opentelemetry.io/collector/scraper/scraperhelper"
11+
)
12+
13+
type Config struct {
14+
scraperhelper.ControllerConfig `mapstructure:",squash"`
15+
}
16+
17+
// nolint: ireturn
18+
func CreateDefaultConfig() component.Config {
19+
cfg := scraperhelper.NewDefaultControllerConfig()
20+
return &Config{
21+
ControllerConfig: cfg,
22+
}
23+
}

internal/collector/containermetricsreceiver/internal/metadata/generated_status.go

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

0 commit comments

Comments
 (0)