Skip to content

Commit

Permalink
[exporter/datadog] Add Azure, GCP and Docker hostname providers (#10819)
Browse files Browse the repository at this point in the history
* [exporter/datadog] Add 'gcp' hostname provider

* [exporter/datadog] Add 'docker' hostname provider

* [exporter/datadog] Add 'azure' hostname provider

* Apply suggestions from code review

Co-authored-by: Julien Lebot <[email protected]>

Co-authored-by: Julien Lebot <[email protected]>
  • Loading branch information
mx-psi and julien-lebot authored Jun 9, 2022
1 parent d0563b1 commit e90064f
Show file tree
Hide file tree
Showing 8 changed files with 542 additions and 12 deletions.
24 changes: 19 additions & 5 deletions exporter/datadogexporter/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ require (
github.com/DataDog/datadog-agent/pkg/quantile v0.36.0-rc.4.0.20220426134022-b55bccd5073f
github.com/DataDog/datadog-agent/pkg/trace/exportable v0.0.0-20201016145401-4646cf596b02
github.com/DataDog/sketches-go v1.4.1
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.31.0
github.com/aws/aws-sdk-go v1.44.28
github.com/cenkalti/backoff/v4 v4.1.3
github.com/gogo/protobuf v1.3.2
github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.53.0
github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders v0.53.0
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.53.0
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/stretchr/testify v1.7.2
Expand All @@ -24,15 +26,21 @@ require (
)

require (
cloud.google.com/go/compute v1.6.1 // indirect
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/DataDog/datadog-agent/pkg/util/log v0.0.0-20201009092105-58e18918b2db // indirect
github.com/DataDog/datadog-go v4.8.2+incompatible // indirect
github.com/Microsoft/go-winio v0.5.1 // indirect
github.com/Microsoft/go-winio v0.5.2 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgraph-io/ristretto v0.1.0 // indirect
github.com/docker/distribution v2.8.1+incompatible // indirect
github.com/docker/docker v20.10.16+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
Expand All @@ -45,29 +53,35 @@ require (
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/philhofer/fwd v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/shirou/gopsutil v2.20.9+incompatible // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/stretchr/objx v0.2.0 // indirect
github.com/tinylib/msgp v1.1.2 // indirect
github.com/zorkian/go-datadog-api v2.30.0+incompatible // indirect
go.opencensus.io v0.23.0 // indirect
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
go.uber.org/atomic v1.9.0 // indirect
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect
golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect
google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3 // indirect
google.golang.org/grpc v1.47.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal

replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => ../../internal/metadataproviders

replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => ../../pkg/resourcetotelemetry

// see https://github.com/go-chi/chi/issues/713
Expand Down
229 changes: 223 additions & 6 deletions exporter/datadogexporter/go.sum

Large diffs are not rendered by default.

13 changes: 12 additions & 1 deletion exporter/datadogexporter/internal/metadata/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,36 @@ import (
"go.opentelemetry.io/collector/component"
"go.uber.org/zap"

"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/azure"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/ec2"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/gcp"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/system"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/provider"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/valid"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/utils/cache"
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders/docker"
)

// UsePreviewHostnameLogic decides whether to use the preview hostname logic or not.
const UsePreviewHostnameLogic = false

func buildPreviewProvider(set component.TelemetrySettings, configHostname string) (provider.HostnameProvider, error) {
dockerProvider, err := docker.NewProvider()
if err != nil {
return nil, err
}

chain, err := provider.Chain(
set.Logger,
map[string]provider.HostnameProvider{
"config": provider.Config(configHostname),
"docker": dockerProvider,
"azure": azure.NewProvider(),
"ec2": ec2.NewProvider(set.Logger),
"gcp": gcp.NewProvider(),
"system": system.NewProvider(set.Logger),
},
[]string{"config", "ec2", "system"},
[]string{"config", "docker", "azure", "ec2", "gcp", "system"},
)

if err != nil {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// 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 azure // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/azure"

import (
"context"

"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/provider"

"github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders/azure"
)

var _ provider.HostnameProvider = (*Provider)(nil)

type Provider struct {
detector azure.Provider
}

// Hostname returns the Azure cloud integration hostname.
func (p *Provider) Hostname(ctx context.Context) (string, error) {
metadata, err := p.detector.Metadata(ctx)
if err != nil {
return "", err
}

return metadata.VMID, nil
}

// NewProvider creates a new Azure hostname provider.
func NewProvider() *Provider {
return &Provider{detector: azure.NewProvider()}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// 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 azure

import (
"context"
"testing"

"github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders/azure"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestProvider(t *testing.T) {
mp := &azure.MockProvider{}
mp.On("Metadata").Return(&azure.ComputeMetadata{
Location: "location",
Name: "name",
VMID: "vmID",
VMSize: "vmSize",
SubscriptionID: "subscriptionID",
ResourceGroupName: "resourceGroup",
VMScaleSetName: "myScaleset",
}, nil)

provider := &Provider{detector: mp}
hostname, err := provider.Hostname(context.Background())
require.NoError(t, err)
assert.Equal(t, "vmID", hostname)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// 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 docker // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/docker"

import (
"context"

"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/provider"
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders/docker"
)

var _ provider.HostnameProvider = (*Provider)(nil)

type Provider struct {
detector docker.Provider
}

// Hostname returns the hostname from the Docker socket.
func (p *Provider) Hostname(ctx context.Context) (string, error) {
return p.detector.Hostname(ctx)
}

// NewProvider creates a new Docker hostname provider.
func NewProvider() (*Provider, error) {
detector, err := docker.NewProvider()
if err != nil {
return nil, err
}
return &Provider{detector: detector}, nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// 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 "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/internal/gcp"

import (
"context"
"fmt"
"strings"

"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/datadogexporter/internal/metadata/provider"

"github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp"
)

var _ provider.HostnameProvider = (*Provider)(nil)

var _ gcpDetector = gcp.NewDetector()

type gcpDetector interface {
ProjectID() (string, error)
CloudPlatform() gcp.Platform
GCEHostName() (string, error)
}

type Provider struct {
detector gcpDetector
}

// Hostname returns the GCP cloud integration hostname.
func (p *Provider) Hostname(context.Context) (string, error) {
if p.detector.CloudPlatform() != gcp.GCE {
return "", fmt.Errorf("not on Google Cloud Engine")
}

name, err := p.detector.GCEHostName()
if err != nil {
return "", fmt.Errorf("failed to get instance name: %w", err)
}

// Use the same logic as in the metadata from attributes logic.
if strings.Count(name, ".") >= 3 {
name = strings.SplitN(name, ".", 2)[0]
}

cloudAccount, err := p.detector.ProjectID()
if err != nil {
return "", fmt.Errorf("failed to get project ID: %w", err)
}

return fmt.Sprintf("%s.%s", name, cloudAccount), nil
}

// NewProvider creates a new GCP hostname provider.
func NewProvider() *Provider {
return &Provider{detector: gcp.NewDetector()}
}
Loading

0 comments on commit e90064f

Please sign in to comment.