Skip to content

Commit

Permalink
GCE Resource Detector (#132)
Browse files Browse the repository at this point in the history
Implements detection of GCP resource tags.
  • Loading branch information
YANYZP committed Jul 24, 2020
1 parent 2baa898 commit 5c2cfc3
Show file tree
Hide file tree
Showing 5 changed files with 494 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ updates:
directory: "/" # Location of package manifests
schedule:
interval: "daily"
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/detectors/gcp" # Location of package manifests
schedule:
interval: "daily"
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/tools" # Location of package manifests
schedule:
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

### Added

- Create a detector that collects resources from GCE machines. (#132)
- Add instrumentation for Kafka (github.com/Shopify/sarama). (#134)
- Add links and status message for mock span. (#134)


## [0.9.0] - 2020-07-20

This release upgrades its [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go/releases/tag/v0.9.0) dependency to v0.9.0.
Expand All @@ -23,6 +25,7 @@ This release upgrades its [go.opentelemetry.io/otel](https://github.com/open-tel
- Update dependabot configuration to correctly check all included packages. (#131)
- Update `RELEASING.md` with correct `tag.sh` command. (#130)


## [0.8.0] - 2020-07-10

This release upgrades its [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go/releases/tag/v0.8.0) dependency to v0.8.0, includes minor fixes, and new instrumentation.
Expand Down
106 changes: 106 additions & 0 deletions detectors/gcp/gce.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package gcp

import (
"context"
"fmt"
"os"
"strings"

"cloud.google.com/go/compute/metadata"

"go.opentelemetry.io/otel/api/kv"
"go.opentelemetry.io/otel/api/standard"
"go.opentelemetry.io/otel/sdk/resource"
)

// GCE collects resource information of GCE computing instances
type GCE struct{}

// compile time assertion that GCE implements the resource.Detector interface.
var _ resource.Detector = (*GCE)(nil)

// Detect detects associated resources when running on GCE hosts.
func (gce *GCE) Detect(ctx context.Context) (*resource.Resource, error) {
if !metadata.OnGCE() {
return nil, nil
}

labels := []kv.KeyValue{
standard.CloudProviderGCP,
}

var errInfo []string

if projectID, err := metadata.ProjectID(); hasProblem(err) {
errInfo = append(errInfo, err.Error())
} else if projectID != "" {
labels = append(labels, standard.CloudAccountIDKey.String(projectID))
}

if zone, err := metadata.Zone(); hasProblem(err) {
errInfo = append(errInfo, err.Error())
} else if zone != "" {
labels = append(labels, standard.CloudZoneKey.String(zone))

splitArr := strings.SplitN(zone, "-", 3)
if len(splitArr) == 3 {
standard.CloudRegionKey.String(strings.Join(splitArr[0:2], "-"))
}
}

if instanceID, err := metadata.InstanceID(); hasProblem(err) {
errInfo = append(errInfo, err.Error())
} else if instanceID != "" {
labels = append(labels, standard.HostIDKey.String(instanceID))
}

if name, err := metadata.InstanceName(); hasProblem(err) {
errInfo = append(errInfo, err.Error())
} else if name != "" {
labels = append(labels, standard.HostNameKey.String(name))
}

if hostname, err := os.Hostname(); hasProblem(err) {
errInfo = append(errInfo, err.Error())
} else if hostname != "" {
labels = append(labels, standard.HostHostNameKey.String(hostname))
}

if hostType, err := metadata.Get("instance/machine-type"); hasProblem(err) {
errInfo = append(errInfo, err.Error())
} else if hostType != "" {
labels = append(labels, standard.HostTypeKey.String(hostType))
}

var aggregatedErr error
if len(errInfo) > 0 {
aggregatedErr = fmt.Errorf("detecting GCE resources: %s", errInfo)
}

return resource.New(labels...), aggregatedErr
}

// hasProblem checks if the err is not nil or for missing resources
func hasProblem(err error) bool {
if err == nil {
return false
}
if _, undefined := err.(metadata.NotDefinedError); undefined {
return false
}
return true
}
8 changes: 8 additions & 0 deletions detectors/gcp/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module go.opentelemetry.io/contrib/detectors/gcp

go 1.14

require (
cloud.google.com/go v0.61.0
go.opentelemetry.io/otel v0.9.0
)
Loading

0 comments on commit 5c2cfc3

Please sign in to comment.