-
Notifications
You must be signed in to change notification settings - Fork 489
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
otel: include service instance id attribute to resource and move to m…
…etricutil package Add the service instance id to the resource attributes to prevent downstream OTEL processors and exporters from thinking that the CLI invocations are a single process that keeps restarting. The unique id can be removed through downstream aggregation to prevent cardinality issues, but we need some way to tell OTEL that it shouldn't reset the counters. Move the check for the experimental flag to its own package and then use that invocation to prevent creating exporters so metrics are disabled completely. This makes it so we don't have to check for the experimental flag in every place we add metrics until we decide to make metrics stable in general. This also moves the OTEL initialization to a `util/metricutil` package to be more consistent with the existing util naming and to differentiate it from the upstream `metric` name. Using both `metrics` and `metric` as import names was confusing since `metric` was an upstream dependency and `metrics` was a local utility. `metricutil` matches with the existing utilities and makes clear that it isn't a spelling mistake. The record version metric has been removed since we weren't planning on keeping that metric anyway and most of the information is now included in the instrumentation library name and version. That function is included as a utility in the `otel/sdk/metric` package to retrieve the appropriate meter from the meter provider. Signed-off-by: Jonathan A. Sternberg <[email protected]>
- Loading branch information
1 parent
2c3d7da
commit c65b7ed
Showing
7 changed files
with
149 additions
and
101 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package confutil | ||
|
||
import ( | ||
"os" | ||
"strconv" | ||
) | ||
|
||
// IsExperimental checks if the experimental flag has been configured. | ||
func IsExperimental() bool { | ||
if v, ok := os.LookupEnv("BUILDX_EXPERIMENTAL"); ok { | ||
vv, _ := strconv.ParseBool(v) | ||
return vv | ||
} | ||
return false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package metricutil | ||
|
||
import ( | ||
"context" | ||
"os" | ||
"path/filepath" | ||
"sync" | ||
|
||
"github.com/google/uuid" | ||
"go.opentelemetry.io/otel" | ||
"go.opentelemetry.io/otel/sdk/resource" | ||
semconv "go.opentelemetry.io/otel/semconv/v1.21.0" | ||
) | ||
|
||
var ( | ||
res *resource.Resource | ||
resOnce sync.Once | ||
) | ||
|
||
// Resource retrieves the OTEL resource for the buildx CLI. | ||
func Resource() *resource.Resource { | ||
resOnce.Do(func() { | ||
var err error | ||
res, err = resource.New(context.Background(), | ||
resource.WithDetectors(serviceNameDetector{}), | ||
resource.WithAttributes( | ||
// Use a unique instance id so OTEL knows that each invocation | ||
// of the CLI is its own instance. Without this, downstream | ||
// OTEL processors may think the same process is restarting | ||
// continuously and reset the metric counters. | ||
semconv.ServiceInstanceID(uuid.New().String()), | ||
), | ||
resource.WithFromEnv(), | ||
resource.WithTelemetrySDK(), | ||
) | ||
if err != nil { | ||
otel.Handle(err) | ||
} | ||
}) | ||
return res | ||
} | ||
|
||
type serviceNameDetector struct{} | ||
|
||
func (serviceNameDetector) Detect(ctx context.Context) (*resource.Resource, error) { | ||
return resource.StringDetector( | ||
semconv.SchemaURL, | ||
semconv.ServiceNameKey, | ||
func() (string, error) { | ||
return filepath.Base(os.Args[0]), nil | ||
}, | ||
).Detect(ctx) | ||
} |