Skip to content

Commit

Permalink
[chore] use mdatagen to generate service metrics
Browse files Browse the repository at this point in the history
This PR follows open-telemetry#10159 and uses the new mdatagen functionality to generate
async metrics in the service.

Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com>
  • Loading branch information
codeboten committed May 15, 2024
1 parent 82a4799 commit 267f27a
Show file tree
Hide file tree
Showing 5 changed files with 292 additions and 81 deletions.
155 changes: 155 additions & 0 deletions service/internal/metadata/generated_telemetry.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

63 changes: 63 additions & 0 deletions service/internal/metadata/generated_telemetry_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

93 changes: 12 additions & 81 deletions service/internal/proctelemetry/process_telemetry.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,9 @@ import (

"github.com/shirou/gopsutil/v3/common"
"github.com/shirou/gopsutil/v3/process"
otelmetric "go.opentelemetry.io/otel/metric"
"go.uber.org/multierr"
)

const (
scopeName = "go.opentelemetry.io/collector/service/process_telemetry"
processNameKey = "process_name"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/service/internal/metadata"
)

// processMetrics is a struct that contains views related to process metrics (cpu, mem, etc)
Expand All @@ -28,13 +24,6 @@ type processMetrics struct {
proc *process.Process
context context.Context

otelProcessUptime otelmetric.Float64ObservableCounter
otelAllocMem otelmetric.Int64ObservableGauge
otelTotalAllocMem otelmetric.Int64ObservableCounter
otelSysMem otelmetric.Int64ObservableGauge
otelCPUSeconds otelmetric.Float64ObservableCounter
otelRSSMemory otelmetric.Int64ObservableGauge

// mu protects everything bellow.
mu sync.Mutex
lastMsRead time.Time
Expand Down Expand Up @@ -64,7 +53,7 @@ func WithHostProc(hostProc string) RegisterOption {

// RegisterProcessMetrics creates a new set of processMetrics (mem, cpu) that can be used to measure
// basic information about this process.
func RegisterProcessMetrics(mp otelmetric.MeterProvider, ballastSizeBytes uint64, opts ...RegisterOption) error {
func RegisterProcessMetrics(cfg component.TelemetrySettings, ballastSizeBytes uint64, opts ...RegisterOption) error {
set := registerOption{}
for _, opt := range opts {
opt.apply(&set)
Expand All @@ -86,73 +75,15 @@ func RegisterProcessMetrics(mp otelmetric.MeterProvider, ballastSizeBytes uint64
return err
}

return pm.record(mp.Meter(scopeName))
}

func (pm *processMetrics) record(meter otelmetric.Meter) error {
var errs, err error

pm.otelProcessUptime, err = meter.Float64ObservableCounter(
"process_uptime",
otelmetric.WithDescription("Uptime of the process"),
otelmetric.WithUnit("s"),
otelmetric.WithFloat64Callback(func(_ context.Context, o otelmetric.Float64Observer) error {
o.Observe(pm.updateProcessUptime())
return nil
}))
errs = multierr.Append(errs, err)

pm.otelAllocMem, err = meter.Int64ObservableGauge(
"process_runtime_heap_alloc_bytes",
otelmetric.WithDescription("Bytes of allocated heap objects (see 'go doc runtime.MemStats.HeapAlloc')"),
otelmetric.WithUnit("By"),
otelmetric.WithInt64Callback(func(_ context.Context, o otelmetric.Int64Observer) error {
o.Observe(pm.updateAllocMem())
return nil
}))
errs = multierr.Append(errs, err)

pm.otelTotalAllocMem, err = meter.Int64ObservableCounter(
"process_runtime_total_alloc_bytes",
otelmetric.WithDescription("Cumulative bytes allocated for heap objects (see 'go doc runtime.MemStats.TotalAlloc')"),
otelmetric.WithUnit("By"),
otelmetric.WithInt64Callback(func(_ context.Context, o otelmetric.Int64Observer) error {
o.Observe(pm.updateTotalAllocMem())
return nil
}))
errs = multierr.Append(errs, err)

pm.otelSysMem, err = meter.Int64ObservableGauge(
"process_runtime_total_sys_memory_bytes",
otelmetric.WithDescription("Total bytes of memory obtained from the OS (see 'go doc runtime.MemStats.Sys')"),
otelmetric.WithUnit("By"),
otelmetric.WithInt64Callback(func(_ context.Context, o otelmetric.Int64Observer) error {
o.Observe(pm.updateSysMem())
return nil
}))
errs = multierr.Append(errs, err)

pm.otelCPUSeconds, err = meter.Float64ObservableCounter(
"process_cpu_seconds",
otelmetric.WithDescription("Total CPU user and system time in seconds"),
otelmetric.WithUnit("s"),
otelmetric.WithFloat64Callback(func(_ context.Context, o otelmetric.Float64Observer) error {
o.Observe(pm.updateCPUSeconds())
return nil
}))
errs = multierr.Append(errs, err)

pm.otelRSSMemory, err = meter.Int64ObservableGauge(
"process_memory_rss",
otelmetric.WithDescription("Total physical memory (resident set size)"),
otelmetric.WithUnit("By"),
otelmetric.WithInt64Callback(func(_ context.Context, o otelmetric.Int64Observer) error {
o.Observe(pm.updateRSSMemory())
return nil
}))
errs = multierr.Append(errs, err)

return errs
_, err = metadata.NewTelemetryBuilder(cfg,
metadata.WithProcessUptimeCallback(pm.updateProcessUptime),
metadata.WithProcessRuntimeHeapAllocBytesCallback(pm.updateAllocMem),
metadata.WithProcessRuntimeTotalAllocBytesCallback(pm.updateTotalAllocMem),
metadata.WithProcessRuntimeTotalSysMemoryBytesCallback(pm.updateSysMem),
metadata.WithProcessCPUSecondsCallback(pm.updateCPUSeconds),
metadata.WithProcessMemoryRssCallback(pm.updateRSSMemory),
)
return err
}

func (pm *processMetrics) updateProcessUptime() float64 {
Expand Down
Loading

0 comments on commit 267f27a

Please sign in to comment.