Azure / azure-sdk-for-net

This repository is for active development of the Azure SDK for .NET. For consumers of the SDK we recommend visiting our public developer docs at https://learn.microsoft.com/dotnet/azure/ or our versioned developer docs at https://azure.github.io/azure-sdk-for-net.
MIT License
5.47k stars 4.8k forks source link

[FEATURE REQ] Controlling the "type" name of an OTEL activity in Application Insights #44762

Closed mortenbock closed 1 month ago

mortenbock commented 4 months ago

Library name and version

Azure.Monitor.OpenTelemetry.AspNetCore 1.2.0

Query/Question

I am trying to instrument a library so it adds dependency tracking when used in the application.

Looking at how the HttpClient is instrumented, I can see that it shows up in App Insights like this: HTTP: GET httpstat.us/200

Looking at the underlying item in the log, it has properties like this:

itemType: dependency
name: GET /200
target: httpstat.us
type: HTTP
data: https://httpstat.us/200

How can I control these properties when using the .StartActivity() method?

By default, I get something that looks like this:

itemType: dependency
name: MyActivityName
target: MyActivityName
type: InProc
  1. Can I change the InProc type to something else?
  2. Can I set different values in name and target?
  3. Can I add information to the data field?

Environment

.NET SDK: Version: 8.0.300 Commit: 326f6e68b2 Workload version: 8.0.300-manifests.9e3391ed MSBuild version: 17.10.4+10fbfbf2e

Runtime Environment: OS Name: Windows OS Version: 10.0.22631 OS Platform: Windows RID: win-x64 Base Path: C:\Program Files\dotnet\sdk\8.0.300\

.NET workloads installed: [aspire] Installation Source: VS 17.10.34916.146 Manifest Version: 8.0.0/8.0.100 Manifest Path: C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.aspire\8.0.0\WorkloadManifest.json Install Type: Msi

Host: Version: 8.0.6 Architecture: x64 Commit: 3b8b000a0e

.NET SDKs installed: 6.0.423 [C:\Program Files\dotnet\sdk] 7.0.410 [C:\Program Files\dotnet\sdk] 8.0.106 [C:\Program Files\dotnet\sdk] 8.0.300 [C:\Program Files\dotnet\sdk]

.NET runtimes installed: Microsoft.AspNetCore.All 2.1.30 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.App 2.1.30 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 3.1.32 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 6.0.30 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 6.0.31 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 7.0.19 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 7.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 8.0.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 8.0.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.NETCore.App 2.1.30 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 3.1.32 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 6.0.30 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 6.0.31 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 7.0.19 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 7.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 8.0.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 8.0.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.WindowsDesktop.App 3.1.32 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 6.0.30 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 6.0.31 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 7.0.19 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 7.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 8.0.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 8.0.6 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found: x86 [C:\Program Files (x86)\dotnet] registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables: Not set

global.json file: Not found

Learn more: https://aka.ms/dotnet/info

Download .NET: https://aka.ms/dotnet/download

github-actions[bot] commented 4 months ago

Thanks for the feedback! We are routing this to the appropriate team for follow-up. cc @cijothomas @rajkumar-rangaraj @reyang @TimothyMothra @vishweshbankwar.

cijothomas commented 4 months ago

Mapping of Span kind, etc. is undocumented :( Fix should be in the docs page and would apply to all languages.

TimothyMothra commented 4 months ago

Hi @mortenbock, I'm not completely following what you're trying to accomplish

Are you trying to emit custom Dependency Telemetry from your app? Or is this a library that's emitting Activities and your hosting application is using OTel?

If you please could share a minimal example app of your approach that would help me understand.

mortenbock commented 4 months ago

@TimothyMothra I have a couple of scenarios I want to achieve.

The first is an application that has some background tasks running for some integration jobs on a schedule. I want to create a root activity when these tasks are started. Using the classic Insights SDK, I did this by making a DependencyTelemetry operation, and setting the Type property on that.

What I've got now in the Otel version is this:

using (var jobActivity = OtelConfiguration.ActivitySource.StartActivity(
           name: "ProductImport",
           kind: ActivityKind.Internal,
           parentId: null))
{
    // Run some integration work
    await DoSomeWork();
}

This shows up in Application Insights as a "InProc" type, but I would like to control that type, so I can differentiate between different types of dependencies.

The second scenario is a more typical wrapper library for an API, where the standard http dependency telemetry doesn't quite make sense when analyzing it, so I want to wrap the operations in a custom activity that makes the trace more readable/useful.

In that case the it might make sense to set the "Type" to "HTTP", or it might be even better to set it to identify the external api like "AchmeApi".

I hope this clarifies the usecases I'm looking at?

TimothyMothra commented 4 months ago

Sorry for the delay, thanks for the extra information. Unfortunately this field is not customizable today. We've mapped it to specific types assuming dependencies would be created from Instrumentation libraries.

I changed this title to a Feature Req, we're tracking which outstanding fields users are asking for. As of today I can't give an estimate on when this will be available.

cc: @mattmccleary

TimothyMothra commented 1 month ago

I'm consolidating all issues regarding overriding specific fields in the Application Insights schema into another issue to help with tracking. https://github.com/Azure/azure-sdk-for-net/issues/46021