From 671a945046d83c44194542bf47f49f1b83da34bf Mon Sep 17 00:00:00 2001 From: Johannes Tax Date: Mon, 22 Apr 2024 15:21:04 +0200 Subject: [PATCH 1/3] Add service instance id resource detector --- detectors/service/go.mod | 21 +++++++++++++ detectors/service/go.sum | 29 ++++++++++++++++++ detectors/service/service.go | 37 +++++++++++++++++++++++ detectors/service/service_test.go | 50 +++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+) create mode 100644 detectors/service/go.mod create mode 100644 detectors/service/go.sum create mode 100644 detectors/service/service.go create mode 100644 detectors/service/service_test.go diff --git a/detectors/service/go.mod b/detectors/service/go.mod new file mode 100644 index 00000000000..effc7427955 --- /dev/null +++ b/detectors/service/go.mod @@ -0,0 +1,21 @@ +module go.opentelemetry.io/contrib/detectors/service + +go 1.21.1 + +require ( + github.com/google/uuid v1.6.0 + github.com/stretchr/testify v1.9.0 + go.opentelemetry.io/otel v1.25.0 + go.opentelemetry.io/otel/sdk v1.25.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/otel/metric v1.25.0 // indirect + go.opentelemetry.io/otel/trace v1.25.0 // indirect + golang.org/x/sys v0.18.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/detectors/service/go.sum b/detectors/service/go.sum new file mode 100644 index 00000000000..29b3b603967 --- /dev/null +++ b/detectors/service/go.sum @@ -0,0 +1,29 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= +go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= +go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= +go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= +go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= +go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= +go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= +go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/detectors/service/service.go b/detectors/service/service.go new file mode 100644 index 00000000000..b8bb9c27e3f --- /dev/null +++ b/detectors/service/service.go @@ -0,0 +1,37 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package service // import "go.opentelemetry.io/contrib/detectors/service" + +import ( + "context" + + "github.com/google/uuid" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/resource" + semconv "go.opentelemetry.io/otel/semconv/v1.24.0" +) + +type serviceDetector struct { +} + +// New returns a [resource.Detector] that will detect service resources. +func New() resource.Detector { + return &serviceDetector{} +} + +// Detect detects resources associated to a service. +func (detector *serviceDetector) Detect(ctx context.Context) (*resource.Resource, error) { + version4Uuid, err := uuid.NewRandom() + + if err != nil { + return nil, err + } + + attributes := []attribute.KeyValue{ + semconv.ServiceInstanceID(version4Uuid.String()), + } + + return resource.NewWithAttributes(semconv.SchemaURL, attributes...), nil +} diff --git a/detectors/service/service_test.go b/detectors/service/service_test.go new file mode 100644 index 00000000000..c95e27fc29f --- /dev/null +++ b/detectors/service/service_test.go @@ -0,0 +1,50 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package service + +import ( + "context" + "regexp" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDetectFormat(t *testing.T) { + detector := New() + + serviceResource, err := detector.Detect(context.Background()) + assert.NoError(t, err) + + var uuid string + + for _, kv := range serviceResource.Attributes() { + if kv.Key == "service.instance.id" { + uuid = kv.Value.AsString() + } + } + + matched, err := regexp.MatchString("^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$", uuid) + assert.NoError(t, err) + assert.True(t, matched) +} + +func TestDetectRandom(t *testing.T) { + uuids := map[string] int{} + + for i := 0; i < 10; i++ { + detector := New() + + serviceResource, err := detector.Detect(context.Background()) + assert.NoError(t, err) + + for _, kv := range serviceResource.Attributes() { + if kv.Key == "service.instance.id" { + uuids[kv.Value.AsString()] = 1 + } + } + } + + assert.Equal(t, 10, len(uuids)) +} From 47bf1d7c886e18eda28f4bf12a1f9b70bba07f0c Mon Sep 17 00:00:00 2001 From: Johannes Tax Date: Tue, 23 Apr 2024 16:14:49 +0200 Subject: [PATCH 2/3] Add changelog --- .github/dependabot.yml | 9 +++++++++ CHANGELOG.md | 1 + detectors/service/README.md | 19 +++++++++++++++++++ versions.yaml | 1 + 4 files changed, 30 insertions(+) create mode 100644 detectors/service/README.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bb6bf7d7278..f779bb82413 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -172,6 +172,15 @@ updates: schedule: interval: weekly day: sunday + - package-ecosystem: gomod + directory: /detectors/service + labels: + - dependencies + - go + - Skip Changelog + schedule: + interval: weekly + day: sunday - package-ecosystem: gomod directory: /exporters/autoexport labels: diff --git a/CHANGELOG.md b/CHANGELOG.md index e15cbf3c8c7..ad58f059461 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Add the new `go.opentelemetry.io/contrib/instrgen` package to provide auto-generated source code instrumentation. (#3068, #3108) - `NewSDK` in `go.opentelemetry.io/contrib/config` now returns a configured SDK with a valid `MeterProvider`. (#4804) +- Add the new `go.opentelemetry.io/contrib/detectors/service` package to provide a resource detector for service attributes. (#5423) ### Changed diff --git a/detectors/service/README.md b/detectors/service/README.md new file mode 100644 index 00000000000..dbfcd5a3f9c --- /dev/null +++ b/detectors/service/README.md @@ -0,0 +1,19 @@ +# Service Resource detector + +The service resource detector supports detecting attributes specific services. + +## Usage + +```golang +// Instantiate a new host resource detector +serviceResourceDetector := service.New() +resource, err := serviceResourceDetector.Detect(context.Background()) +``` + +## Supported attributes + +According to semantic conventions for +[service](https://github.com/open-telemetry/semantic-conventions/tree/main/docs/resource#service-experimental) +attributes, the following attributes is added: + +* `service.instance.id` diff --git a/versions.yaml b/versions.yaml index 0513ed39d41..62b6390d517 100644 --- a/versions.yaml +++ b/versions.yaml @@ -20,6 +20,7 @@ module-sets: modules: - go.opentelemetry.io/contrib/bridges/prometheus - go.opentelemetry.io/contrib/detectors/aws/lambda + - go.opentelemetry.io/contrib/detectors/service - go.opentelemetry.io/contrib/exporters/autoexport - go.opentelemetry.io/contrib/propagators/autoprop - go.opentelemetry.io/contrib/propagators/opencensus From 5ce579a849ca445eccfdca2a646995eb6339d34e Mon Sep 17 00:00:00 2001 From: Johannes Tax Date: Tue, 23 Apr 2024 16:27:10 +0200 Subject: [PATCH 3/3] Fix linter issue --- detectors/service/service.go | 4 +--- detectors/service/service_test.go | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/detectors/service/service.go b/detectors/service/service.go index b8bb9c27e3f..fee7368ff00 100644 --- a/detectors/service/service.go +++ b/detectors/service/service.go @@ -13,8 +13,7 @@ import ( semconv "go.opentelemetry.io/otel/semconv/v1.24.0" ) -type serviceDetector struct { -} +type serviceDetector struct{} // New returns a [resource.Detector] that will detect service resources. func New() resource.Detector { @@ -24,7 +23,6 @@ func New() resource.Detector { // Detect detects resources associated to a service. func (detector *serviceDetector) Detect(ctx context.Context) (*resource.Resource, error) { version4Uuid, err := uuid.NewRandom() - if err != nil { return nil, err } diff --git a/detectors/service/service_test.go b/detectors/service/service_test.go index c95e27fc29f..6d65dc5f42a 100644 --- a/detectors/service/service_test.go +++ b/detectors/service/service_test.go @@ -31,7 +31,7 @@ func TestDetectFormat(t *testing.T) { } func TestDetectRandom(t *testing.T) { - uuids := map[string] int{} + uuids := map[string]int{} for i := 0; i < 10; i++ { detector := New()