azure-sdk-for-cpp/doc/DistributedTracing.md
Larry Osterman b8330a1f5c
Merge main into feature/websockets. (#3994)
* Stress test (#3820)

* mem leak fix

* PR comments fix

* PR comments

* seems to work?

* clang

* curl again

* add first stress test

* also update gitignore

* missing line

* only linux

* clang typo format

* typo 2

* PR comments

* cspell

* remove terminator

* Fixed the metadata for better handling (#3824)

Co-authored-by: sima-zhu <sizhu@microsoft.com>

* Update attestation core vcpkg dependency to latest GA version that is required. (#3830)

* Update attestation core vcpkg dependency to latest GA version that is required.

* Update vcpkg config.cmake to match the dependency version needed.

* Remove winhttp (#3832)

* remove refs to winhttp

* this tsst only curl

* Move perf.yml to eng/common (#3833)

Co-authored-by: Mike Harder <mharder@microsoft.com>

* Sync eng/common directory with azure-sdk-tools for PR 3656 (#3834)

* someone wants to reference the test-proxy startup scripts externally. to make this easy on them we're parameterizing the root of the eng/common for easy use in that scenario
* two leading $ signs on the definition of the certificate path was causing some issues!

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* Update casing for 'verison' (#3821)

Co-authored-by: Daniel Jurek <djurek@microsoft.com>

* Print additional result summary formats to pipelines UI (#3842)

Co-authored-by: Mike Harder <mharder@microsoft.com>

* Sync eng/common directory with azure-sdk-tools for PR 3702 (#3843)

* Add language-service to list of valid sample slugs

* Update link to taxonomies

Co-authored-by: Heath Stewart <heaths@microsoft.com>

* Fix incorrect failure notification in vcpkg publishing (#3838)

* Set up for testing of template pipeline

* Override branches, set up for template GA release

* More TODOs to prevent merging an unintended change

* More removal of TestPipeline

* Increment template version number

* Use script to set package version

* Check out the correct branch

* branch parameter in the command

* Use $(PublishToVcpkg) to determine if we should check for changes

* dictionary syntax

* Set GA package version to validate GA publish scenario

* Update changelog

* create-pull-request.yml optionally pushes changes

* Output GH PR URI

* Macro syntax with a variable set earlier

* Move up to 1.2.0-beta.2

* beta.1

* Revert changelog

* Revert testing-related changes

* Revert vcpkg-clone.yml

* Revert eng/common changes, ensure global $(HasChanges) is set properly

* Changes to enable testing

* 1.1.0-beta.1

* vcpkg clone should clone at configured branch

* Clone "main" branch of vcpkg betas

* Undo test-specific changes

* More PR cleanup

* PR cleanup

* Helm charts (#3841)

* helm chart

* first pipe setup

* poi

* magiks

* ewewe

* stress

* cleanup

* pr

* QFE and readme

* clang

* stupid clang , waste of time

* ewqwewewrqrewewrqewrqwrqr

* stupid clang

* cspell

* PR

* try try again

* clang again

* Sync eng/common directory with azure-sdk-tools for PR 3661 (#3846)

* Add full clone fallback to sparse checkout

* Improve clone handling and overrides for sparse checkout

* Use SkipSparseCheckout variable name

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Sync eng/common directory with azure-sdk-tools for PR 3735 (#3845)

* Detect API changes using new snadboxinx approach

* Added strictmode

* Remove unset variable

* Changes as per strict mode 3

* Rervert strict mode to allow language level fixes to merge first

Co-authored-by: praveenkuttappan <prmarott@microsoft.com>

* Increment version for keyvault releases (#3809)

* Increment package version after release of azure-security-keyvault-keys

* Increment package version after release of azure-security-keyvault-secrets

* Increment package version after release of azure-security-keyvault-certificates

* Removed hard dependency on opentelemetry version (#3844)

* Revert "Add full clone fallback to sparse checkout (#3661)" (#3851)

This reverts commit 7605ead00308dd20f20f2afe5acc4ec9900a2c47.

Co-authored-by: Ben Broderick Phillips <ben@benbp.net>

* Sync eng/common directory with azure-sdk-tools for PR 3753 (#3857)

* Bump MacOs version to macos-11

* Update eng/common/scripts/job-matrix/tests/job-matrix-functions.tests.ps1

Co-authored-by: Wes Haggard <weshaggard@users.noreply.github.com>

* Update eng/common/scripts/job-matrix/tests/job-matrix-functions.tests.ps1

Co-authored-by: Wes Haggard <weshaggard@users.noreply.github.com>

Co-authored-by: sima-zhu <sizhu@microsoft.com>
Co-authored-by: Sima Zhu <48036328+sima-zhu@users.noreply.github.com>
Co-authored-by: Wes Haggard <weshaggard@users.noreply.github.com>

* Bump macOs version to macos-11 (#3853)

* Update CHANGELOG.md

* Fix misleading step name in az module install (#3859)

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Retry poll calls on EINTR (#3858)

When signals are delievered to the process, calls here to poll may be
interrupted and return with a spurious failure.  The call instead should be
restarted.

* Fix bad path to sample matrix json (#3860)

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Sync eng/common directory with azure-sdk-tools for PR 3826 (#3863)

* Add link checking for stress CI

* Remove region segment from stress testing links

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Core August releases (#3862)

* Core August releases

* cspell

Co-authored-by: Anton Kolesnyk <antkmsft@users.noreply.github.com>

* Increment version for core releases (#3865)

* Increment package version after release of azure-core

* Increment package version after release of azure-core-tracing-opentelemetry

* Storage Aug GA release (#3864)

* CG only runs on internal (#3866)

* Condition added and indentation changes

* STG 79 80 81 Features (#3850)

* Sync eng/common directory with azure-sdk-tools for PR 3860 (#3871)

* updating pfx and cert
* update the targeted version of the proxy as well

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* Storage August Preview Release (#3868)

* Storage August Preview Release

* update versions

* Increment version for storage releases (#3875)

* Increment package version after release of azure-storage-common

* Increment package version after release of azure-storage-blobs

* Fix an issue that reason phrase is missing as expected from HTTP/2 server (#3879)

* Fix an issue that reason phrase is missing as expected from HTTP/2 server

* reverse the condition

* compact comments

* fix clang format

* Update CODEOWNERS (#3881)

* updated targeted proxy version to one that properly allows consumption of TLS certificates (#3888)

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* Fix `azure-storage-blobs-cpp` beta install (#3889)

Co-authored-by: Anton Kolesnyk <antkmsft@users.noreply.github.com>

* Fixed #3899 - Handle new OSX version correctly; reformatted platform-matrix JSON files (#3900)

* Simpler get-binarysizes check for OSX (#3901)

* Simpler get-binarysizes check for OSX

* Missed wildcard

* Sync eng/common directory with azure-sdk-tools for PR 3874 (#3907)

* Add sparse checkout to perf template

* Rename base template, add parameters

* Add comment

* Add TODO

* Fix copy/pase bug, add language to artifacts path

* Fix language ref

* Fix python language

* perf.yml extends perf-base.yml

* Remove unnecessary base yml

* Fetch pull request refs

* Fix refs path

* Fetch commitish if matches PR syntax

* Print command before running

* Add PR commitish to remote.origin.fetch

* Add pool and vmimage parameters

* Map ref under "refs/remotes/origin"

* Add ref to refs/remotes/origin

Co-authored-by: Mike Harder <mharder@microsoft.com>

* File Share Features until STG82 (#3908)

* Empty file or existing file won't be created/overwritten if the blob to be downloaded doesn't exist. (#3910)

* Remove unnecessary checkout: none that causes conflicts with sparse checkout declarations (#3915)

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Core September Release (#3913)

Co-authored-by: Anton Kolesnyk <antkmsft@users.noreply.github.com>

* Increment package version after release of azure-core (#3919)

* Migrate SkipDefaultCheckout to SkipCheckoutNone (#3916)

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Storage Sept Release (#3914)

* Increment version for storage releases (#3924)

* Increment package version after release of azure-storage-common

* Increment package version after release of azure-storage-blobs

* Increment package version after release of azure-storage-files-shares

* Add github actions based check enforcer (#3922)

* Add `$schema` to `cgmanifest.json` (#3918)

Co-authored-by: Jamie Magee <jamie.magee@microsoft.com>

* Remove SkipDefaultCheckout parameter (#3930)

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Compatibility improvement for striped blob (#3932)

* add a parameter 'condition' to the test-proxy ci invocations. (#3931)

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* storage ad-hoc release (#3934)

* Increment package version after release of azure-storage-blobs (#3935)

* Update `AttestationClient::AttestTpm` API to match existing `AttestOpenEnclave` and `AttestSgxmEnclave`  (#3928)

* Fix broken link and typo in contributing.md

* Use vector<uint8_t> for attest instead of strings

* remove options

* fix comments

* update release version

* remove versionig

* revert changelog

* add the change

* update comment

* Update sdk/attestation/azure-security-attestation/CHANGELOG.md

Co-authored-by: Larry Osterman <LarryOsterman@users.noreply.github.com>

* fix formatting

* address pr comment

* fix formating

* update a comment

* remove the attest tpm comment

Co-authored-by: Peng Li <pengfeli@microsoft.com>
Co-authored-by: Larry Osterman <LarryOsterman@users.noreply.github.com>

* Update check enforcer yaml permissions and name (#3944)

* Set VCPKG_ROOT (#3938)

* Set VCPKG_ROOT

* Update eng/pipelines/templates/steps/vcpkg-clone.yml

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>

* Sync the devops helper scripts between azure-sdk repo and tools repo (#3949)

This should fix https://github.com/Azure/azure-sdk-tools/issues/3538
as it will now upgrade the devops extension to the latest version
which has the auth fix needed.

Co-authored-by: Wes Haggard <Wes.Haggard@microsoft.com>

* Add Win32FileTimeConverter (#3941)

* Sync eng/common directory with azure-sdk-tools for PR 4169 (#3950)

* pin newest version of proxy

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* Enable Query() test in blob SDK (#3960)

* Sync eng/common directory with azure-sdk-tools for PR 4212 (#3962)

* version including lock fixes
* target the correct proxy version

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* Pipeline core (#3953)

* test1

* glob

* quick cleanup

* ddasda

* ddsa

* envs

* dsds

* Revert "ddsa"

This reverts commit 6d9e385284ba37736fb5bc41e56065943abd7937.

* wq

* comment out issues

* valid test

* maybe

* qwewqewq

* lang steps

* Vcpkg pre-steps in the place Daniel should've recommend they go

* RepoOwner

* Correct repo owner name

* Remove vcpkg.yml (we don't need to write)

* PR trigger

* small change

* Update eng/pipelines/templates/jobs/perf.yml

Co-authored-by: Mike Harder <mharder@microsoft.com>

* Update eng/pipelines/templates/jobs/perf.yml

Co-authored-by: Mike Harder <mharder@microsoft.com>

* Update sdk/core/perf.yml

Co-authored-by: Mike Harder <mharder@microsoft.com>

Co-authored-by: Daniel Jurek <djurek@microsoft.com>
Co-authored-by: Mike Harder <mharder@microsoft.com>

* Win32FileTimeConverter (#3967)

* Sync eng/common directory with azure-sdk-tools for PR 4240 (#3965)

* use version of docker with CLI present

* target repaired executable

Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>

* Revert "Add Win32FileTimeConverter (#3941)" (#3966)

This reverts commit 14e4f52b91.

* add test case for batch options on snapshots and versions (#3970)

* add test case for batch options on snapshots and versions

* recording

* Merge feature/datalakestg82 (#3973)

* Build subscription configuration from cloud config values (#3976)

* fix LROs in keyvault (#3952)

* fix LROs in keyvault

* qfe

* some cleanup

* fdd

* clangs

* correct fix

* oops

* Pull all Websockets changes to main except for WebSockets itself. (#3954)

* Pulled WebSocket fixes into main except for WebSockets functionality


Co-authored-by: Rick Winter <rick.winter@microsoft.com>
Co-authored-by: Daniel Jurek <djurek@microsoft.com>
Co-authored-by: George Arama <50641385+gearama@users.noreply.github.com>
Co-authored-by: Ahson Khan <ahson_ahmedk@yahoo.com>
Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>
Co-authored-by: Anton Kolesnyk <antkmsft@users.noreply.github.com>

* Upadte Attestation changelog.md (#3992)

* Remove cspell directive from being visible (#3993)

* Post-merge changes to websockets code

* Update Attestation readme.md (#3991)

* Added back WebSocket_server.py

* Added Start-WebSocketServer.ps1 to list of files to copy

* clang-format

* Fixed memory leak in curl (#3995)

* Fixed memory leak in curl

* fixed documentation in unique_handle.hpp

Co-authored-by: George Arama <50641385+gearama@users.noreply.github.com>
Co-authored-by: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com>
Co-authored-by: sima-zhu <sizhu@microsoft.com>
Co-authored-by: Ahson Khan <ahson_ahmedk@yahoo.com>
Co-authored-by: Mike Harder <mharder@microsoft.com>
Co-authored-by: scbedd <45376673+scbedd@users.noreply.github.com>
Co-authored-by: Daniel Jurek <djurek@microsoft.com>
Co-authored-by: Heath Stewart <heaths@microsoft.com>
Co-authored-by: Ben Broderick Phillips <bebroder@microsoft.com>
Co-authored-by: praveenkuttappan <prmarott@microsoft.com>
Co-authored-by: Ben Broderick Phillips <ben@benbp.net>
Co-authored-by: Sima Zhu <48036328+sima-zhu@users.noreply.github.com>
Co-authored-by: Wes Haggard <weshaggard@users.noreply.github.com>
Co-authored-by: Rick Winter <rick.winter@microsoft.com>
Co-authored-by: John Heffner <john@topofcenter.net>
Co-authored-by: Anton Kolesnyk <41349689+antkmsft@users.noreply.github.com>
Co-authored-by: Anton Kolesnyk <antkmsft@users.noreply.github.com>
Co-authored-by: JinmingHu <jinmhu@microsoft.com>
Co-authored-by: Jonathan Cárdenas <JonathanCrd@users.noreply.github.com>
Co-authored-by: keshen-msft <53491277+keshen-msft@users.noreply.github.com>
Co-authored-by: microzchang <110015819+microzchang@users.noreply.github.com>
Co-authored-by: Jamie Magee <jamie.magee@gmail.com>
Co-authored-by: Jamie Magee <jamie.magee@microsoft.com>
Co-authored-by: Peng Li <86324823+penglimsft@users.noreply.github.com>
Co-authored-by: Peng Li <pengfeli@microsoft.com>
Co-authored-by: Wes Haggard <Wes.Haggard@microsoft.com>
2022-10-05 14:24:54 -07:00

247 lines
12 KiB
Markdown

<!-- cspell:words openetelemetry -->
# Distributed Tracing in the C++ SDK
Azure has adopted [W3C Distributed Tracing](https://www.w3.org/TR/trace-context/) as a paradigm for correlating
requests from clients across multiple services.
This document explains how the Azure C++ SDK implements distributed tracing, how clients integrate with distributed tracing, how
services should integrate with distributed tracing and finally how the network pipeline and other functionality should
integrate with distributed tracing.
## Tracing Overview
The Azure SDK for C++ Tracing APIs are modeled after the opentelemetry-cpp API surface defined in the [OpenTelemetry Tracing Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md).
Additional architectural information about OpenTelemetry can be found in [OpenTelemetry Concepts](https://opentelemetry.io/docs/concepts/).
There are three major components which the Azure SDK components interact with:
- `TracerProvider` - this is a factory which creates `Tracer` objects.
- `Tracer` - this is a factory which creates `Span` objects.
- `Span` - Span objects are the APIs which allow tracing an operation.
Each `span` has a name, a type and a "status". `Spans` also contain "attributes" and "events" which describe an operation.
There is typically a single `TracerProvider` for each application, and for the Azure SDK, each
service will have a `Tracer` implementation which creates `Span` objects for each service client.
A `Span` can be considered a "unit of work" for a service. Each service method (method which calls into the service) will have a single `Span` reflecting the client method which
was called.
`Span`'s are hierarchical and each span can have multiple children (each `Span` can only have a single parent). The typical way that this manifests itself during a
service method call is:
- Service Method "MyServiceMethod" creates a span named "MyServiceMethod" and starts an HTTP request to communicate with the service.
- The HTTP pipeline (specifically the `RequestActivityPolicy`) will create a child `span` under the service method `span` named `"HTTP <verb> #0"`. This span
reflects the HTTP call into the service.
- If the HTTP call needs to be retried, the existing `span` will be closed an a new span named `HTTP <verb> #1` will be created for the retry.
## Distributed Tracing Client Integration
Applications which wish to integrate Distributed Tracing are strongly encouraged
to use the [opentelemetry-cpp](https://github.com/open-telemetry/opentelemetry-cpp) vcpkg package.
There are numerous examples on the OpenTelemetry web site which demonstrate how to integrate
opentelemetry into a customer application and integrate the generated traces
with Azure monitoring infrastructure such as Geneva Monitoring.
Following the examples from opentelemetry-cpp, the following can be used
to establish an OpenTelemetry exporter which logs to the console or to an
in-memory logger.
```c++
opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>
CreateOpenTelemetryProvider()
{
#if USE_MEMORY_EXPORTER
auto exporter = std::make_unique<opentelemetry::exporter::memory::InMemorySpanExporter>();
#else
auto exporter = std::make_unique<opentelemetry::exporter::trace::OStreamSpanExporter>();
#endif
// simple processor
auto simple_processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(
new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter)));
auto always_on_sampler = std::unique_ptr<opentelemetry::sdk::trace::AlwaysOnSampler>(
new opentelemetry::sdk::trace::AlwaysOnSampler);
auto resource_attributes = opentelemetry::sdk::resource::ResourceAttributes{
{"service.name", "telemetryTest"}, {"service.instance.id", "instance-1"}};
auto resource = opentelemetry::sdk::resource::Resource::Create(resource_attributes);
// Create using SDK configurations as parameter
return opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>(
new opentelemetry::sdk::trace::TracerProvider(
std::move(simple_processor), resource, std::move(always_on_sampler)));
}
```
Other exporters exist to export to [Jaeger](https://github.com/open-telemetry/opentelemetry-cpp/tree/main/exporters/jaeger),
[Windows ETW](https://github.com/open-telemetry/opentelemetry-cpp/tree/main/exporters/etw) and others.
Once the `opentelemetry::trace::TracerProvider` has been created, The client needs to create a new `Azure::Core::Tracing::OpenTelemetry::OpenTelemetryProvider` which
functions as an abstract class integration between OpenTelemetry and Azure Core:
```c++
std::shared_ptr<Azure::Core::Tracing::TracerProvider> traceProvider
= Azure::Core::Tracing::OpenTelemetry::OpenTelemetryProvider::Create(CreateOpenTelemetryProvider());
```
To finish the integration with Azure clients, there are two mechanisms to integrate OpenTelemetry into a client application:
1) `Azure::Core::Context` integration.
1) Service Client Options integration.
### Integrate an OpenTelemetryProvider via the ApplicationContext
To integrate OpenTelemetry for all Azure Clients in the application, the customer can call `Azure::Core::Context::ApplicationContext.SetTracerProvider` to establish the
tracer provider for the application.
```c++
Azure::Core::Context::ApplicationContext.SetTracerProvider(provider);
```
### Integrate an OpenTelemetryProvider via Service ClientOptions
While using the ApplicationContext is the simplest mechanism for integration OpenTelemetry with a customer application, there may be times the customer needs more flexibility when creating service clients.
To enable customers to further customize how tracing works, the application can set the `Telemetry.TracingProvider` field in the service client options, which will establish the tracer provider used by
the service client.
```c++
auto tracerProvider(CreateOpenTelemetryProvider());
auto provider(Azure::Core::Tracing::OpenTelemetry::OpenTelemetryProvider::Create(tracerProvider));
ServiceClientOptions clientOptions;
clientOptions.Telemetry.TracingProvider = provider;
clientOptions.Telemetry.ApplicationId = "MyApplication";
ServiceClient myServiceClient(clientOptions);
```
## Distributed Tracing Service Integration
There are two steps needed to integrate Distributed Tracing with a Service Client.
1. Add a `DiagnosticTracingFactory` object to the ServiceClient object
1. Update each service method as follows:
1. Add a call to the `CreateSpan` method on the diagnostic tracing factory. This will create a new span for the client operation.
1. Call `SetStatus` on the created span when the service method successfully completes.
1. Wrap the client method code with a try/catch handler which catches exceptions and call AddEvent with the value of the exception.
### Add a `DiagnosticTracingFactory` to the serviceClient class
To add a new `DiagnosticTracingFactory` to the client, simply add the class as a member:
```c++
Azure::Core::Tracing::_internal::TracingContextFactory m_tracingFactory;
```
And construct the new tracing factory in the service constructor:
```c++
explicit ServiceClient(ServiceClientOptions const& clientOptions = ServiceClientOptions{})
: m_tracingFactory(clientOptions, "Azure.Core.OpenTelemetry.Test.Service", PackageVersion::ToString())
```
### Update Each Service Method
There are three methods of interest when updating the service method:
1. `DiagnosticTracingFactory::CreateSpan` - this creates and returns a `Span` and `Context` object for the service method. The returned Context object must be used for subsequent service operations.
1. `Span::AddEvent(std::exception&)` - This registers the exception with the distributed tracing infrastructure.
1. `Span::SetStatus` - This sets the status of the operation in the trace.
```c++
Azure::Response<std::string> ServiceMethod(
std::string const&,
Azure::Core::Context const& context = Azure::Core::Context{})
{
// Create a new context and span for this request.
auto contextAndSpan = m_tracingFactory.CreateSpan("ServiceMethod", context);
// contextAndSpan.Context is the new context for the operation.
// contextAndSpan.Span is the new span for the operation.
try
{
// <Call Into Service via an HTTP pipeline>
Azure::Core::Http::Request requestToSend(
HttpMethod::Get, Azure::Core::Url("<Service URL>"));
std::unique_ptr<Azure::Core::Http::RawResponse> response
= m_pipeline->Send(requestToSend, contextAndSpan.Context);
contextAndSpan.Span.SetStatus(Azure::Core::Tracing::_internal::SpanStatus::Ok);
return Azure::Response<std::string>("", std::move(response));
}
catch (std::exception const& ex)
{
// Register that the exception has happened and that the span is now in error.
contextAndSpan.Span.AddEvent(ex);
throw;
}
// When contextAndSpan.second goes out of scope, it ends the span, which will record it.
}
};
```
## Implementation Details
### Distributed Tracing components
In order to maintain flexibility, the opentelemetry-cpp APIs are implemented in a separate package - azure-core-tracing-opentelemetry.
This is consistent with how opentelemetry is distributed for
the other Azure SDKs.
The Azure Core API surface interacts with a set of pure virtual base classes (aka "interfaces") in
the `Azure::Core::Tracing` and `Azure::Core::Tracing::_internal` namespace. These allow a level of separation
between the Azure Core API surface and the OpenTelemetry API surface - an alternative tracing mechanism needs
to provide APIs consistent with the `Azure::Core::Tracing` APIs.
The azure-core-tracing-openetelemetry-cpp package implements a set of APIs in the `Azure::Core::Tracing::OpenTelemetry`
and `Azure::Core::Tracing::OpenTelemetry::_detail` namespace. These provide an Azure Core compatable API surface for distributed tracing.
The core service client interface is the `DiagnosticTracingFactory` class which implements two APIs: `CreateSpan` and
`CreateSpanFromContext`. `CreateSpan` is intended to be used by service methods which have direct access to a
`DiagnosticTracingFactory` object, `CreateSpanFromContext` in intended to be used from code which does NOT have
direct access to the `DiagnosticTracingFactory`.
The final significant piece of the distributed tracing infrastructure is the `RequestActivityPolicy` - this policy MUST be
inserted into the HTTP pipeline AFTER the `RetryPolicy`. It is responsible for creating the span associated with the HTTP request, it will
also propagate the W3C distributed tracing headers from the span into the HTTP request.
### Generated traces
The Azure standards for distributed tracing are define in [Azure Distributed Tracing Conventions](https://github.com/Azure/azure-sdk/blob/main/docs/tracing/distributed-tracing-conventions.md).
The actual tracing elements generated by Azure services are defined in [Azure Tracing Conventions YAML](https://github.com/Azure/azure-sdk/blob/main/docs/tracing/distributed-tracing-conventions.yml).
In summary, these are the traces and attributes which should be generated
for azure services:
#### Spans
The distributed tracing standards define the following traces:
##### Public APIs
All public APIs MUST create a span which will describes the API.
The name of the span MUST be the API name.
##### HTTP Calls
Each HTTP request sent to the service MUST create a span describing the request to the service.
The name of the span MUST be of the form `HTTP <HTTP VERB> #<HTTP RETRY>`.
#### Attributes
Generated traces have the following attributes:
| Attribute Name | Semantics | Where Used
|-----------|--------|-------
| `az.namespace` |Namespace of the azure service request| All spans.
| `http.method`| HTTP Method ("GET", "PUT", etc)| HTTP Spans.
| `http.url`| URL being retrieved (sanitized)| HTTP Spans.
| `http.status_code` | HTTP status code returned by the service | HTTP Spans.
| `http.user_agent` | The value of the `User-Agent` HTTP header sent to the service | HTTP Spans.
| `requestId` | The value of the `x-ms-client-request-id` header sent by the client | HTTP Spans.
| `serviceRequestId` | The value of the `x-ms-request-id` sent by the server | HTTP Spans.