diff --git a/receiver/nsxtreceiver/go.mod b/receiver/nsxtreceiver/go.mod index 4c52cca5fb02..602b1e96ae8e 100644 --- a/receiver/nsxtreceiver/go.mod +++ b/receiver/nsxtreceiver/go.mod @@ -16,7 +16,6 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/vmware/go-vmware-nsxt v0.0.0-20220328155605-f49a14c1ef5f go.opencensus.io v0.23.0 // indirect - go.opentelemetry.io/collector/model v0.50.0 go.opentelemetry.io/otel v1.7.0 // indirect go.opentelemetry.io/otel/metric v0.30.0 // indirect go.opentelemetry.io/otel/trace v1.7.0 // indirect diff --git a/receiver/nsxtreceiver/go.sum b/receiver/nsxtreceiver/go.sum index 3a745be9b853..2527fae2109f 100644 --- a/receiver/nsxtreceiver/go.sum +++ b/receiver/nsxtreceiver/go.sum @@ -222,8 +222,6 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/collector v0.51.0 h1:r4cfvLYkmdTWU+RioL2QqxD/GLJUXRNifG0NCfRmxwk= go.opentelemetry.io/collector v0.51.0/go.mod h1:2pHwJxKDhSd4t42GkiCosU9G3szHoWUK2R0qnB6X67A= -go.opentelemetry.io/collector/model v0.50.0 h1:1wt8pQ4O6GaUeYEaR+dh3zHmYsFicduF2bbPGMZeSKk= -go.opentelemetry.io/collector/model v0.50.0/go.mod h1:vKpC0JMtrL7g9tUHmzcQqd8rEbnahKVdTWZSVO7x3Ms= go.opentelemetry.io/collector/pdata v0.51.0 h1:J5CCnrg1iGOA1CfFOH+wAkMlJ1vjcm677kuPp18mbko= go.opentelemetry.io/collector/pdata v0.51.0/go.mod h1:FsowYKNmf8CgsHgOfJv8V3KjALmy6FYQRHtXAOY3fho= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE= diff --git a/receiver/nsxtreceiver/internal/metadata/generated_metrics_v2.go b/receiver/nsxtreceiver/internal/metadata/generated_metrics_v2.go index ef2ac7cacd7b..3359b638b133 100644 --- a/receiver/nsxtreceiver/internal/metadata/generated_metrics_v2.go +++ b/receiver/nsxtreceiver/internal/metadata/generated_metrics_v2.go @@ -575,47 +575,65 @@ func (mb *MetricsBuilder) updateCapacity(rm pmetric.ResourceMetrics) { } } -// ResourceOption applies changes to provided resource. -type ResourceOption func(pcommon.Resource) +// ResourceMetricsOption applies changes to provided resource metrics. +type ResourceMetricsOption func(pmetric.ResourceMetrics) // WithDeviceID sets provided value as "device.id" attribute for current resource. -func WithDeviceID(val string) ResourceOption { - return func(r pcommon.Resource) { - r.Attributes().UpsertString("device.id", val) +func WithDeviceID(val string) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + rm.Resource().Attributes().UpsertString("device.id", val) } } // WithNsxtNodeID sets provided value as "nsxt.node.id" attribute for current resource. -func WithNsxtNodeID(val string) ResourceOption { - return func(r pcommon.Resource) { - r.Attributes().UpsertString("nsxt.node.id", val) +func WithNsxtNodeID(val string) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + rm.Resource().Attributes().UpsertString("nsxt.node.id", val) } } // WithNsxtNodeName sets provided value as "nsxt.node.name" attribute for current resource. -func WithNsxtNodeName(val string) ResourceOption { - return func(r pcommon.Resource) { - r.Attributes().UpsertString("nsxt.node.name", val) +func WithNsxtNodeName(val string) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + rm.Resource().Attributes().UpsertString("nsxt.node.name", val) } } // WithNsxtNodeType sets provided value as "nsxt.node.type" attribute for current resource. -func WithNsxtNodeType(val string) ResourceOption { - return func(r pcommon.Resource) { - r.Attributes().UpsertString("nsxt.node.type", val) +func WithNsxtNodeType(val string) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + rm.Resource().Attributes().UpsertString("nsxt.node.type", val) + } +} + +// WithStartTimeOverride overrides start time for all the resource metrics data points. +// This option should be only used if different start time has to be set on metrics coming from different resources. +func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption { + return func(rm pmetric.ResourceMetrics) { + metrics := rm.ScopeMetrics().At(0).Metrics() + for i := 0; i < metrics.Len(); i++ { + dps := pmetric.NewNumberDataPointSlice() + switch metrics.At(i).DataType() { + case pmetric.MetricDataTypeGauge: + dps = metrics.At(i).Gauge().DataPoints() + case pmetric.MetricDataTypeSum: + dps = metrics.At(i).Sum().DataPoints() + } + for j := 0; j < dps.Len(); j++ { + dps.At(j).SetStartTimestamp(start) + } + } } } // EmitForResource saves all the generated metrics under a new resource and updates the internal state to be ready for // recording another set of data points as part of another resource. This function can be helpful when one scraper // needs to emit metrics from several resources. Otherwise calling this function is not required, -// just `Emit` function can be called instead. Resource attributes should be provided as ResourceOption arguments. -func (mb *MetricsBuilder) EmitForResource(ro ...ResourceOption) { +// just `Emit` function can be called instead. +// Resource attributes should be provided as ResourceMetricsOption arguments. +func (mb *MetricsBuilder) EmitForResource(rmo ...ResourceMetricsOption) { rm := pmetric.NewResourceMetrics() rm.Resource().Attributes().EnsureCapacity(mb.resourceCapacity) - for _, op := range ro { - op(rm.Resource()) - } ils := rm.ScopeMetrics().AppendEmpty() ils.Scope().SetName("otelcol/nsxtreceiver") ils.Metrics().EnsureCapacity(mb.metricsCapacity) @@ -626,6 +644,9 @@ func (mb *MetricsBuilder) EmitForResource(ro ...ResourceOption) { mb.metricNsxtNodeMemoryUsage.emit(ils.Metrics()) mb.metricNsxtNodeNetworkIo.emit(ils.Metrics()) mb.metricNsxtNodeNetworkPacketCount.emit(ils.Metrics()) + for _, op := range rmo { + op(rm) + } if ils.Metrics().Len() > 0 { mb.updateCapacity(rm) rm.MoveTo(mb.metricsBuffer.ResourceMetrics().AppendEmpty()) @@ -635,8 +656,8 @@ func (mb *MetricsBuilder) EmitForResource(ro ...ResourceOption) { // Emit returns all the metrics accumulated by the metrics builder and updates the internal state to be ready for // recording another set of metrics. This function will be responsible for applying all the transformations required to // produce metric representation defined in metadata and user settings, e.g. delta or cumulative. -func (mb *MetricsBuilder) Emit(ro ...ResourceOption) pmetric.Metrics { - mb.EmitForResource(ro...) +func (mb *MetricsBuilder) Emit(rmo ...ResourceMetricsOption) pmetric.Metrics { + mb.EmitForResource(rmo...) metrics := pmetric.NewMetrics() mb.metricsBuffer.MoveTo(metrics) return metrics diff --git a/receiver/nsxtreceiver/scraper.go b/receiver/nsxtreceiver/scraper.go index f5a068f3fd82..95d44f4366ff 100644 --- a/receiver/nsxtreceiver/scraper.go +++ b/receiver/nsxtreceiver/scraper.go @@ -22,7 +22,7 @@ import ( "time" "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/model/pdata" + "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/receiver/scrapererror" "go.uber.org/zap" @@ -66,13 +66,13 @@ const ( managerClass ) -func (s *scraper) scrape(ctx context.Context) (pdata.Metrics, error) { +func (s *scraper) scrape(ctx context.Context) (pmetric.Metrics, error) { r, err := s.retrieve(ctx) if err != nil { return pmetric.NewMetrics(), err } - colTime := pdata.NewTimestampFromTime(time.Now()) + colTime := pcommon.NewTimestampFromTime(time.Now()) s.process(r, colTime) return s.mb.Emit(), nil } @@ -186,7 +186,7 @@ func (s *scraper) retrieveNodeStats( func (s *scraper) process( nodes []*nodeInfo, - colTime pdata.Timestamp, + colTime pcommon.Timestamp, ) { for _, n := range nodes { for _, i := range n.interfaces { @@ -196,7 +196,7 @@ func (s *scraper) process( } } -func (s *scraper) recordNodeInterface(colTime pdata.Timestamp, nodeProps dm.NodeProperties, i interfaceInformation) { +func (s *scraper) recordNodeInterface(colTime pcommon.Timestamp, nodeProps dm.NodeProperties, i interfaceInformation) { s.mb.RecordNsxtNodeNetworkPacketCountDataPoint(colTime, i.stats.RxDropped, metadata.AttributeDirectionReceived, metadata.AttributePacketTypeDropped) s.mb.RecordNsxtNodeNetworkPacketCountDataPoint(colTime, i.stats.RxErrors, metadata.AttributeDirectionReceived, metadata.AttributePacketTypeErrored) successRxPackets := i.stats.RxPackets - i.stats.RxDropped - i.stats.RxErrors @@ -219,7 +219,7 @@ func (s *scraper) recordNodeInterface(colTime pdata.Timestamp, nodeProps dm.Node } func (s *scraper) recordNode( - colTime pdata.Timestamp, + colTime pcommon.Timestamp, info *nodeInfo, ) { if info.stats == nil { diff --git a/receiver/nsxtreceiver/scraper_test.go b/receiver/nsxtreceiver/scraper_test.go index f4b058ceb7f0..dff2985cf419 100644 --- a/receiver/nsxtreceiver/scraper_test.go +++ b/receiver/nsxtreceiver/scraper_test.go @@ -26,7 +26,7 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/config/confighttp" - "go.opentelemetry.io/collector/model/pdata" + "go.opentelemetry.io/collector/pdata/pcommon" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/scrapertest" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/scrapertest/golden" @@ -149,7 +149,7 @@ func TestScraperRecordNoStat(t *testing.T) { componenttest.NewNopTelemetrySettings(), ) scraper.host = componenttest.NewNopHost() - scraper.recordNode(pdata.NewTimestampFromTime(time.Now()), &nodeInfo{stats: nil}) + scraper.recordNode(pcommon.NewTimestampFromTime(time.Now()), &nodeInfo{stats: nil}) } func loadTestNodeStatus(t *testing.T, nodeID string, class nodeClass) (*dm.NodeStatus, error) {