Skip to content

Commit 7549a77

Browse files
authored
Initial implementation of the azotel module (#20916)
* Initial implementation of the azotel module It contains a complete end-to-end example of creating an OTel TracerAdapter that exports spans to Jaeger. * some cleanup based on feedback * little more cleanup * cleanup flagged in CI * cleaned up example * make Go version N-3 configurable for opt-out
1 parent 256b7e8 commit 7549a77

File tree

11 files changed

+670
-8
lines changed

11 files changed

+670
-8
lines changed

eng/pipelines/templates/jobs/archetype-sdk-client.yml

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ parameters:
7171
- name: IncludeRelease
7272
type: boolean
7373
default: false
74+
- name: ExcludeGoNMinus3
75+
type: boolean
76+
default: false
7477

7578

7679
stages:
@@ -82,14 +85,16 @@ stages:
8285
- template: /eng/pipelines/templates/variables/globals.yml
8386
strategy:
8487
matrix:
85-
Linux_Go118:
86-
pool.name: azsdk-pool-mms-ubuntu-2004-general
87-
image.name: MMSUbuntu20.04
88-
go.version: '1.18.10'
89-
Windows_Go118:
90-
pool.name: azsdk-pool-mms-win-2022-general
91-
image.name: MMS2022
92-
go.version: '1.18.10'
88+
${{ if eq(parameters.ExcludeGoNMinus3, false) }}:
89+
Linux_Go118:
90+
pool.name: azsdk-pool-mms-ubuntu-2004-general
91+
image.name: MMSUbuntu20.04
92+
go.version: '1.18.10'
93+
${{ if eq(parameters.ExcludeGoNMinus3, false) }}:
94+
Windows_Go118:
95+
pool.name: azsdk-pool-mms-win-2022-general
96+
image.name: MMS2022
97+
go.version: '1.18.10'
9398
Linux_Go119:
9499
pool.name: azsdk-pool-mms-ubuntu-2004-general
95100
image.name: MMSUbuntu20.04

sdk/tracing/azotel/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Release History
2+
3+
## 0.1.0 (Unreleased)
4+
5+
### Features Added
6+
7+
### Breaking Changes
8+
9+
### Bugs Fixed
10+
11+
### Other Changes

sdk/tracing/azotel/LICENSE.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) Microsoft Corporation.
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE

sdk/tracing/azotel/README.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Azure OpenTelemetry Adapter Module for Go
2+
3+
[![PkgGoDev](https://pkg.go.dev/badge/github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel)](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel)
4+
[![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/go%20-%20azcore%20-%20ci?branchName=main)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=1843&branchName=main)
5+
6+
The `azotel` module is used to connect an OpenTelemetry's `TracerAdapter` to an Azure SDK client.
7+
8+
## Getting started
9+
10+
**NOTE: this module requires Go 1.19 or later**
11+
12+
This project uses [Go modules](https://github.com/golang/go/wiki/Modules) for versioning and dependency management.
13+
14+
To add the latest version to your `go.mod` file, execute the following command.
15+
16+
```bash
17+
go get github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel
18+
```
19+
20+
General documentation and examples can be found on [pkg.go.dev](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel).
21+
22+
## Using the adapter
23+
24+
Once you have an OpenTelemetry `TracerProvider`, you connect it to an Azure SDK client via its `ClientOptions`.
25+
26+
```go
27+
options := azcore.ClientOptions{}
28+
options.TracingProvider = azotel.NewTracingProvider(otelProvider, nil)
29+
```
30+
31+
## Contributing
32+
This project welcomes contributions and suggestions. Most contributions require
33+
you to agree to a Contributor License Agreement (CLA) declaring that you have
34+
the right to, and actually do, grant us the rights to use your contribution.
35+
For details, visit [https://cla.microsoft.com](https://cla.microsoft.com).
36+
37+
When you submit a pull request, a CLA-bot will automatically determine whether
38+
you need to provide a CLA and decorate the PR appropriately (e.g., label,
39+
comment). Simply follow the instructions provided by the bot. You will only
40+
need to do this once across all repos using our CLA.
41+
42+
This project has adopted the
43+
[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
44+
For more information, see the
45+
[Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
46+
or contact [[email protected]](mailto:[email protected]) with any
47+
additional questions or comments.

sdk/tracing/azotel/ci.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# NOTE: Please refer to https://aka.ms/azsdk/engsys/ci-yaml before editing this file.
2+
trigger:
3+
branches:
4+
include:
5+
- main
6+
- feature/*
7+
- hotfix/*
8+
- release/*
9+
paths:
10+
include:
11+
- sdk/tracing/azotel
12+
13+
pr:
14+
branches:
15+
include:
16+
- main
17+
- feature/*
18+
- hotfix/*
19+
- release/*
20+
paths:
21+
include:
22+
- sdk/tracing/azotel
23+
24+
stages:
25+
- template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml
26+
parameters:
27+
ServiceDirectory: tracing/azotel
28+
ExcludeGoNMinus3: true

sdk/tracing/azotel/examples_test.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//go:build go1.18
2+
// +build go1.18
3+
4+
// Copyright (c) Microsoft Corporation. All rights reserved.
5+
// Licensed under the MIT License.
6+
7+
package azotel_test
8+
9+
import (
10+
"context"
11+
"fmt"
12+
"os"
13+
14+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
15+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
16+
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
17+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
18+
"github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel"
19+
"go.opentelemetry.io/otel/exporters/jaeger"
20+
"go.opentelemetry.io/otel/sdk/resource"
21+
otelsdk "go.opentelemetry.io/otel/sdk/trace"
22+
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
23+
)
24+
25+
func Example_jaegerExporter() {
26+
// end-to-end example creating an OTel TracerProvider that exports to Jaeger
27+
// then uses the azotel adapter to conenct it to an Azure SDK client.
28+
29+
// create the Jaeger exporter
30+
exp, err := jaeger.New(jaeger.WithCollectorEndpoint())
31+
if err != nil {
32+
fmt.Println(err)
33+
os.Exit(1)
34+
}
35+
36+
// create an OTel TracerProvider that uses the Jaeger exporter
37+
otelTP := otelsdk.NewTracerProvider(
38+
otelsdk.WithBatcher(exp),
39+
otelsdk.WithResource(resource.NewWithAttributes(
40+
semconv.SchemaURL,
41+
semconv.ServiceNameKey.String("Example_jaegerExporter"),
42+
)),
43+
)
44+
45+
// create a credential for the Azure SDK client
46+
credential, err := azidentity.NewDefaultAzureCredential(nil)
47+
if err != nil {
48+
fmt.Println(err)
49+
os.Exit(1)
50+
}
51+
52+
// create an Azure SDK client, connecting the OTel TracerProvider to it
53+
client, err := armresources.NewClientFactory("<subscription ID>", credential, &arm.ClientOptions{
54+
ClientOptions: azcore.ClientOptions{
55+
TracingProvider: azotel.NewTracingProvider(otelTP, nil),
56+
},
57+
})
58+
if err != nil {
59+
fmt.Println(err)
60+
os.Exit(1)
61+
}
62+
63+
// make various API calls with the client. each one will create its own span
64+
_, err = client.NewClient().CheckExistenceByID(context.TODO(), "<resource ID>", "<api-version>", nil)
65+
if err != nil {
66+
fmt.Println(err)
67+
os.Exit(1)
68+
}
69+
70+
// shut down the tracing provider to flush all spans to Jaeger
71+
if err = otelTP.Shutdown(context.TODO()); err != nil {
72+
fmt.Println(err)
73+
os.Exit(1)
74+
}
75+
}

sdk/tracing/azotel/go.mod

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
module github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel
2+
3+
go 1.19
4+
5+
require (
6+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0-beta.1
7+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0
8+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1
9+
github.com/stretchr/testify v1.8.3
10+
go.opentelemetry.io/otel v1.16.0
11+
go.opentelemetry.io/otel/exporters/jaeger v1.16.0
12+
go.opentelemetry.io/otel/sdk v1.16.0
13+
go.opentelemetry.io/otel/trace v1.16.0
14+
)
15+
16+
require (
17+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
18+
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
19+
github.com/davecgh/go-spew v1.1.1 // indirect
20+
github.com/go-logr/logr v1.2.4 // indirect
21+
github.com/go-logr/stdr v1.2.2 // indirect
22+
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
23+
github.com/google/uuid v1.3.0 // indirect
24+
github.com/kylelemons/godebug v1.1.0 // indirect
25+
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
26+
github.com/pmezard/go-difflib v1.0.0 // indirect
27+
go.opentelemetry.io/otel/metric v1.16.0 // indirect
28+
golang.org/x/crypto v0.7.0 // indirect
29+
golang.org/x/net v0.8.0 // indirect
30+
golang.org/x/sys v0.8.0 // indirect
31+
golang.org/x/text v0.8.0 // indirect
32+
gopkg.in/yaml.v3 v3.0.1 // indirect
33+
)

sdk/tracing/azotel/go.sum

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0-beta.1 h1:TpBJ3UP3Vx9OBk1nP/5FynUmQXPeIq2RXadb4gq8ZgU=
2+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0-beta.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
3+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg=
4+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
5+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
6+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
7+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E=
8+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o=
9+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU=
10+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw=
11+
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
12+
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
13+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
14+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
15+
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
16+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
17+
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
18+
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
19+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
20+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
21+
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
22+
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
23+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
24+
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
25+
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
26+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
27+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
28+
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
29+
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
30+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
31+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
32+
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
33+
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
34+
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
35+
go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
36+
go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
37+
go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA=
38+
go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM=
39+
go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
40+
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
41+
go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE=
42+
go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4=
43+
go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
44+
go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
45+
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
46+
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
47+
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
48+
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
49+
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
50+
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
51+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
52+
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
53+
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
54+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
55+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
56+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
57+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
58+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//go:build go1.18
2+
// +build go1.18
3+
4+
// Copyright (c) Microsoft Corporation. All rights reserved.
5+
// Licensed under the MIT License.
6+
7+
package internal
8+
9+
const Version = "v0.1.0"

0 commit comments

Comments
 (0)