From 75558f42d76f4c1841bfffcc28c128bf18b6eb85 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Fri, 22 Mar 2024 10:33:50 +0000 Subject: [PATCH] Add initial docs (#54) * Add initial documentation * Add docs and rename examples --- .vscode/settings.json | 1 + Elastic.OpenTelemetry.sln | 49 +++--- README.md | 161 +++++++++++++++++- docs/design-notes/design-required.md | 23 --- docs/design-notes/technical-issues.md | 0 docs/design-notes/usage-scenarios.md | 10 -- docs/docs.csproj | 1 + docs/getting-started.asciidoc | 155 +++++++++++++++++ ...stic-cloud-opentelemetry-configuration.png | Bin 0 -> 133462 bytes docs/images/trace-sample-minimal-api.png | Bin 0 -> 34554 bytes docs/index.asciidoc | 6 +- docs/intro.asciidoc | 20 +++ .../Controllers/E2EController.cs | 2 +- .../Controllers/HomeController.cs | 5 +- .../Example.AspNetCore.Mvc.csproj} | 0 .../Models/ErrorViewModel.cs | 3 +- .../Program.cs | 0 .../Properties/launchSettings.json | 0 .../Views/E2E/Index.cshtml | 0 .../Views/Home/Index.cshtml | 0 .../Views/Home/Privacy.cshtml | 0 .../Views/Shared/Error.cshtml | 0 .../Views/Shared/_Layout.cshtml | 0 .../Views/Shared/_Layout.cshtml.css | 0 .../Shared/_ValidationScriptsPartial.cshtml | 0 .../Views/_ViewImports.cshtml | 2 + .../Views/_ViewStart.cshtml | 0 .../appsettings.Development.json | 0 .../appsettings.json | 0 .../wwwroot/css/site.css | 0 .../wwwroot/favicon.ico | Bin .../wwwroot/js/site.js | 0 .../wwwroot/lib/bootstrap/LICENSE | 0 .../lib/bootstrap/dist/css/bootstrap-grid.css | 0 .../bootstrap/dist/css/bootstrap-grid.css.map | 0 .../bootstrap/dist/css/bootstrap-grid.min.css | 0 .../dist/css/bootstrap-grid.min.css.map | 0 .../bootstrap/dist/css/bootstrap-grid.rtl.css | 0 .../dist/css/bootstrap-grid.rtl.css.map | 0 .../dist/css/bootstrap-grid.rtl.min.css | 0 .../dist/css/bootstrap-grid.rtl.min.css.map | 0 .../bootstrap/dist/css/bootstrap-reboot.css | 0 .../dist/css/bootstrap-reboot.css.map | 0 .../dist/css/bootstrap-reboot.min.css | 0 .../dist/css/bootstrap-reboot.min.css.map | 0 .../dist/css/bootstrap-reboot.rtl.css | 0 .../dist/css/bootstrap-reboot.rtl.css.map | 0 .../dist/css/bootstrap-reboot.rtl.min.css | 0 .../dist/css/bootstrap-reboot.rtl.min.css.map | 0 .../dist/css/bootstrap-utilities.css | 0 .../dist/css/bootstrap-utilities.css.map | 0 .../dist/css/bootstrap-utilities.min.css | 0 .../dist/css/bootstrap-utilities.min.css.map | 0 .../dist/css/bootstrap-utilities.rtl.css | 0 .../dist/css/bootstrap-utilities.rtl.css.map | 0 .../dist/css/bootstrap-utilities.rtl.min.css | 0 .../css/bootstrap-utilities.rtl.min.css.map | 0 .../lib/bootstrap/dist/css/bootstrap.css | 0 .../lib/bootstrap/dist/css/bootstrap.css.map | 0 .../lib/bootstrap/dist/css/bootstrap.min.css | 0 .../bootstrap/dist/css/bootstrap.min.css.map | 0 .../lib/bootstrap/dist/css/bootstrap.rtl.css | 0 .../bootstrap/dist/css/bootstrap.rtl.css.map | 0 .../bootstrap/dist/css/bootstrap.rtl.min.css | 0 .../dist/css/bootstrap.rtl.min.css.map | 0 .../lib/bootstrap/dist/js/bootstrap.bundle.js | 0 .../bootstrap/dist/js/bootstrap.bundle.js.map | 0 .../bootstrap/dist/js/bootstrap.bundle.min.js | 0 .../dist/js/bootstrap.bundle.min.js.map | 0 .../lib/bootstrap/dist/js/bootstrap.esm.js | 0 .../bootstrap/dist/js/bootstrap.esm.js.map | 0 .../bootstrap/dist/js/bootstrap.esm.min.js | 0 .../dist/js/bootstrap.esm.min.js.map | 0 .../lib/bootstrap/dist/js/bootstrap.js | 0 .../lib/bootstrap/dist/js/bootstrap.js.map | 0 .../lib/bootstrap/dist/js/bootstrap.min.js | 0 .../bootstrap/dist/js/bootstrap.min.js.map | 0 .../jquery-validation-unobtrusive/LICENSE.txt | 0 .../jquery.validate.unobtrusive.js | 0 .../jquery.validate.unobtrusive.min.js | 0 .../wwwroot/lib/jquery-validation/LICENSE.md | 0 .../dist/additional-methods.js | 0 .../dist/additional-methods.min.js | 0 .../jquery-validation/dist/jquery.validate.js | 0 .../dist/jquery.validate.min.js | 0 .../wwwroot/lib/jquery/LICENSE.txt | 0 .../wwwroot/lib/jquery/dist/jquery.js | 0 .../wwwroot/lib/jquery/dist/jquery.min.js | 0 .../wwwroot/lib/jquery/dist/jquery.min.map | 0 .../Example.Console.csproj} | 0 .../Program.cs | 3 +- .../Properties/launchSettings.json | 0 .../Usage.cs | 3 +- .../Views/_ViewImports.cshtml | 3 - .../Example.MinimalApi.csproj | 14 ++ examples/Example.MinimalApi/Program.cs | 57 +++++++ .../Properties/launchSettings.json | 44 +++++ .../appsettings.Development.json | 8 + examples/Example.MinimalApi/appsettings.json | 13 ++ .../Example.WorkerService.csproj} | 0 .../Program.cs | 2 +- .../Properties/launchSettings.json | 0 .../Worker.cs | 3 +- .../appsettings.Development.json | 0 .../appsettings.json | 0 src/Elastic.OpenTelemetry/AgentBuilder.cs | 45 +---- .../AgentBuilderOptions.cs | 45 +++++ .../ServiceCollectionExtensions.cs | 3 +- .../DistributedApplicationFixture.cs | 9 +- .../DotNetRunApplication.cs | 11 +- .../ServiceTests.cs | 2 +- 111 files changed, 573 insertions(+), 130 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 docs/design-notes/design-required.md delete mode 100644 docs/design-notes/technical-issues.md delete mode 100644 docs/design-notes/usage-scenarios.md create mode 100644 docs/getting-started.asciidoc create mode 100644 docs/images/elastic-cloud-opentelemetry-configuration.png create mode 100644 docs/images/trace-sample-minimal-api.png create mode 100644 docs/intro.asciidoc rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Controllers/E2EController.cs (95%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Controllers/HomeController.cs (91%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore/Example.Elastic.OpenTelemetry.AspNetCore.csproj => Example.AspNetCore.Mvc/Example.AspNetCore.Mvc.csproj} (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Models/ErrorViewModel.cs (85%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Program.cs (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Properties/launchSettings.json (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/E2E/Index.cshtml (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/Home/Index.cshtml (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/Home/Privacy.cshtml (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/Shared/Error.cshtml (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/Shared/_Layout.cshtml (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/Shared/_Layout.cshtml.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/Shared/_ValidationScriptsPartial.cshtml (100%) create mode 100644 examples/Example.AspNetCore.Mvc/Views/_ViewImports.cshtml rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/Views/_ViewStart.cshtml (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/appsettings.Development.json (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/appsettings.json (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/css/site.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/favicon.ico (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/js/site.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/LICENSE (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation/LICENSE.md (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation/dist/additional-methods.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation/dist/additional-methods.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation/dist/jquery.validate.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery/LICENSE.txt (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery/dist/jquery.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery/dist/jquery.min.js (100%) rename examples/{Example.Elastic.OpenTelemetry.AspNetCore => Example.AspNetCore.Mvc}/wwwroot/lib/jquery/dist/jquery.min.map (100%) rename examples/{Example.Elastic.OpenTelemetry/Example.Elastic.OpenTelemetry.csproj => Example.Console/Example.Console.csproj} (100%) rename examples/{Example.Elastic.OpenTelemetry => Example.Console}/Program.cs (90%) rename examples/{Example.Elastic.OpenTelemetry => Example.Console}/Properties/launchSettings.json (100%) rename examples/{Example.Elastic.OpenTelemetry => Example.Console}/Usage.cs (99%) delete mode 100644 examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/_ViewImports.cshtml create mode 100644 examples/Example.MinimalApi/Example.MinimalApi.csproj create mode 100644 examples/Example.MinimalApi/Program.cs create mode 100644 examples/Example.MinimalApi/Properties/launchSettings.json create mode 100644 examples/Example.MinimalApi/appsettings.Development.json create mode 100644 examples/Example.MinimalApi/appsettings.json rename examples/{Example.Elastic.OpenTelemetry.Worker/Example.Elastic.OpenTelemetry.Worker.csproj => Example.WorkerService/Example.WorkerService.csproj} (100%) rename examples/{Example.Elastic.OpenTelemetry.Worker => Example.WorkerService}/Program.cs (93%) rename examples/{Example.Elastic.OpenTelemetry.Worker => Example.WorkerService}/Properties/launchSettings.json (100%) rename examples/{Example.Elastic.OpenTelemetry.Worker => Example.WorkerService}/Worker.cs (97%) rename examples/{Example.Elastic.OpenTelemetry.Worker => Example.WorkerService}/appsettings.Development.json (100%) rename examples/{Example.Elastic.OpenTelemetry.Worker => Example.WorkerService}/appsettings.json (100%) create mode 100644 src/Elastic.OpenTelemetry/AgentBuilderOptions.cs diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Elastic.OpenTelemetry.sln b/Elastic.OpenTelemetry.sln index 0aacad7..dab4d7d 100644 --- a/Elastic.OpenTelemetry.sln +++ b/Elastic.OpenTelemetry.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.9.34321.82 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.OpenTelemetry", "src\Elastic.OpenTelemetry\Elastic.OpenTelemetry.csproj", "{79C08F0E-7220-486C-AC0C-E3B287EB0B18}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Elastic.OpenTelemetry", "examples\Example.Elastic.OpenTelemetry\Example.Elastic.OpenTelemetry.csproj", "{32DF4F56-1773-49E9-A8AE-0573F0AA57DE}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E622CFF2-C6C4-40FB-BE42-7C4F2B38B75A}" ProjectSection(SolutionItems) = preProject src\Directory.Build.props = src\Directory.Build.props @@ -20,20 +18,24 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "docs", "docs\docs.csproj", EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{AAD39891-0B70-47FA-A212-43E1AAE5DF56}" ProjectSection(SolutionItems) = preProject + tests\.runsettings = tests\.runsettings tests\Directory.Build.props = tests\Directory.Build.props tests\xunit.runner.json = tests\xunit.runner.json - tests\.runsettings = tests\.runsettings EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.OpenTelemetry.Tests", "tests\Elastic.OpenTelemetry.Tests\Elastic.OpenTelemetry.Tests.csproj", "{22BF9223-3A6D-4197-8527-3E4E43A98A81}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = ".github", ".github\.github.csproj", "{B701E33D-D777-4BD4-A4EC-1F63FE69AF7A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Elastic.OpenTelemetry.AspNetCore", "examples\Example.Elastic.OpenTelemetry.AspNetCore\Example.Elastic.OpenTelemetry.AspNetCore.csproj", "{EC81FA30-C765-4F04-8679-86F16DA3CC65}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elastic.OpenTelemetry.EndToEndTests", "tests\Elastic.OpenTelemetry.EndToEndTests\Elastic.OpenTelemetry.EndToEndTests.csproj", "{B970DBE1-6A04-4014-A285-6A9F36421025}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.MinimalApi", "examples\Example.MinimalApi\Example.MinimalApi.csproj", "{397D7E8D-39C2-41D6-9D4D-F1D35666926A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.AspNetCore.Mvc", "examples\Example.AspNetCore.Mvc\Example.AspNetCore.Mvc.csproj", "{6D7D5234-BE86-46E0-A871-153FE96CD644}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Elastic.OpenTelemetry.Worker", "examples\Example.Elastic.OpenTelemetry.Worker\Example.Elastic.OpenTelemetry.Worker.csproj", "{4377A059-16E0-4D5D-AC03-44C09BCE5BC4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Console", "examples\Example.Console\Example.Console.csproj", "{849FAC2E-8303-4154-8560-31B22194800E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elastic.OpenTelemetry.EndToEndTests", "tests\Elastic.OpenTelemetry.EndToEndTests\Elastic.OpenTelemetry.EndToEndTests.csproj", "{B970DBE1-6A04-4014-A285-6A9F36421025}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.WorkerService", "examples\Example.WorkerService\Example.WorkerService.csproj", "{863CAB86-5EB0-4E9F-B01D-F51687EC6597}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -45,10 +47,6 @@ Global {79C08F0E-7220-486C-AC0C-E3B287EB0B18}.Debug|Any CPU.Build.0 = Debug|Any CPU {79C08F0E-7220-486C-AC0C-E3B287EB0B18}.Release|Any CPU.ActiveCfg = Release|Any CPU {79C08F0E-7220-486C-AC0C-E3B287EB0B18}.Release|Any CPU.Build.0 = Release|Any CPU - {32DF4F56-1773-49E9-A8AE-0573F0AA57DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32DF4F56-1773-49E9-A8AE-0573F0AA57DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32DF4F56-1773-49E9-A8AE-0573F0AA57DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32DF4F56-1773-49E9-A8AE-0573F0AA57DE}.Release|Any CPU.Build.0 = Release|Any CPU {872D0721-A4F2-405C-B0AB-036B340F1907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {872D0721-A4F2-405C-B0AB-036B340F1907}.Debug|Any CPU.Build.0 = Debug|Any CPU {872D0721-A4F2-405C-B0AB-036B340F1907}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -65,29 +63,38 @@ Global {B701E33D-D777-4BD4-A4EC-1F63FE69AF7A}.Debug|Any CPU.Build.0 = Debug|Any CPU {B701E33D-D777-4BD4-A4EC-1F63FE69AF7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B701E33D-D777-4BD4-A4EC-1F63FE69AF7A}.Release|Any CPU.Build.0 = Release|Any CPU - {EC81FA30-C765-4F04-8679-86F16DA3CC65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC81FA30-C765-4F04-8679-86F16DA3CC65}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC81FA30-C765-4F04-8679-86F16DA3CC65}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC81FA30-C765-4F04-8679-86F16DA3CC65}.Release|Any CPU.Build.0 = Release|Any CPU - {4377A059-16E0-4D5D-AC03-44C09BCE5BC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4377A059-16E0-4D5D-AC03-44C09BCE5BC4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4377A059-16E0-4D5D-AC03-44C09BCE5BC4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4377A059-16E0-4D5D-AC03-44C09BCE5BC4}.Release|Any CPU.Build.0 = Release|Any CPU {B970DBE1-6A04-4014-A285-6A9F36421025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B970DBE1-6A04-4014-A285-6A9F36421025}.Debug|Any CPU.Build.0 = Debug|Any CPU {B970DBE1-6A04-4014-A285-6A9F36421025}.Release|Any CPU.ActiveCfg = Release|Any CPU {B970DBE1-6A04-4014-A285-6A9F36421025}.Release|Any CPU.Build.0 = Release|Any CPU + {397D7E8D-39C2-41D6-9D4D-F1D35666926A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {397D7E8D-39C2-41D6-9D4D-F1D35666926A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {397D7E8D-39C2-41D6-9D4D-F1D35666926A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {397D7E8D-39C2-41D6-9D4D-F1D35666926A}.Release|Any CPU.Build.0 = Release|Any CPU + {6D7D5234-BE86-46E0-A871-153FE96CD644}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D7D5234-BE86-46E0-A871-153FE96CD644}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D7D5234-BE86-46E0-A871-153FE96CD644}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D7D5234-BE86-46E0-A871-153FE96CD644}.Release|Any CPU.Build.0 = Release|Any CPU + {849FAC2E-8303-4154-8560-31B22194800E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {849FAC2E-8303-4154-8560-31B22194800E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {849FAC2E-8303-4154-8560-31B22194800E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {849FAC2E-8303-4154-8560-31B22194800E}.Release|Any CPU.Build.0 = Release|Any CPU + {863CAB86-5EB0-4E9F-B01D-F51687EC6597}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {863CAB86-5EB0-4E9F-B01D-F51687EC6597}.Debug|Any CPU.Build.0 = Debug|Any CPU + {863CAB86-5EB0-4E9F-B01D-F51687EC6597}.Release|Any CPU.ActiveCfg = Release|Any CPU + {863CAB86-5EB0-4E9F-B01D-F51687EC6597}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {79C08F0E-7220-486C-AC0C-E3B287EB0B18} = {E622CFF2-C6C4-40FB-BE42-7C4F2B38B75A} - {32DF4F56-1773-49E9-A8AE-0573F0AA57DE} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} {22BF9223-3A6D-4197-8527-3E4E43A98A81} = {AAD39891-0B70-47FA-A212-43E1AAE5DF56} - {EC81FA30-C765-4F04-8679-86F16DA3CC65} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} - {4377A059-16E0-4D5D-AC03-44C09BCE5BC4} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} {B970DBE1-6A04-4014-A285-6A9F36421025} = {AAD39891-0B70-47FA-A212-43E1AAE5DF56} + {397D7E8D-39C2-41D6-9D4D-F1D35666926A} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} + {6D7D5234-BE86-46E0-A871-153FE96CD644} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} + {849FAC2E-8303-4154-8560-31B22194800E} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} + {863CAB86-5EB0-4E9F-B01D-F51687EC6597} = {4E95C87B-655B-4BC3-8F2A-DF06B7AAB7E9} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {573B2B5F-8CBB-4D52-A55A-4E65E282AAFB} diff --git a/README.md b/README.md index 262ead6..5fe4ffa 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,163 @@ # Elastic OpenTelemetry Distribution -This is Elastic's distribution of OpenTelemetry for .NET. +The `Elastic.OpenTelemetry` package contains an Elastic distribution of the +[OpenTelemetry SDK for .NET](https://opentelemetry.io/docs/languages/net). A distribution +is a wrapper around an upstream OpenTelemetry repository with some customizations. For +more details about distributions in general, visit the +[OpenTelemetry documentation](https://opentelemetry.io/docs/concepts/distributions). -## Getting Started +The Elastic distribution includes some Elastic-specific processors to ensure the best +compatibility when exporting OpenTelemetry signal data to an Elastic backend such +as Elastic APM server. The distribution also preconfigures the collection of tracing +and metrics signals, applying some opinionated defaults, such as which sources are +collected by default. The distribution also ensures that the OTLP exporter is enabled +by default. -TODO \ No newline at end of file +The distribution includes extension methods to fully control the creation of the +underlying tracer and metric providers, providing a helpful set of defaults +to get developers up and running quickly with collecting and exporting OpenTelemetry +signals. + +## Getting started + +This guide will show you how to get started with Elastic OpenTelemetry distribution for .NET. + +As the distribution is a lightweight wrapper around the OpenTelemetry SDK, you should be broadly +familiar with the OpenTelemetry SDK concepts and instrumenting applications using the Microsoft +diagnostic APIs. If you are not, we recommend you read the +[OpenTelemetry SDK documentation](https://opentelemetry.io/docs/languages/net) first. + +> **_IMPORTANT:_** The Elastic distribution is currently in early alpha release status. It is not yet feature +complete and may contain bugs. We are actively working on improving the distribution and +adding new features. +> +> If you would like to experience the alpha and help us improve the distribution by providing +early feedback, you can follow the steps below to get started. + +### Prerequisites + +The current documentation and examples are written with .NET 6 and newer applications in mind. +Before continuing, ensure that you have a supported +[.NET SDK version](https://dotnet.microsoft.com/en-us/download/dotnet) installed locally. + +### Installation + +To get started with the Elastic OpenTelemetry distribution, you must add the Elastic OpenTelemetry +NuGet package to your project. This can be achieved by adding the package reference to your project file. + +``` + +``` + +After adding the package reference, you can start using the Elastic OpenTelemetry distribution +in your application. The distribution includes a transitive dependency on the OpenTelemetry SDK, +so you do not need to add the OpenTelemetry SDK package to your project, although doing so will +cause no harm and may be used to opt into newer SDK versions before the Elastic distribution +references them. + +The Elastic OpenTelemetry distribution is designed to be easy to use and integrate into your +applications. This includes applications which have previously used the OpenTelemetry SDK directly. +In situations where the OpenTelemetry SDK is already used, the only required change is +to add the `Elastic.OpenTelemetry` NuGet package to the project. Doing so will automatically +switch to the opinionated configuration provided by the Elastic distribution. + +### ASP.NET Core usage + +A common requirement is to instrument ASP.NET Core applications based on the `Microsoft.Extensions.Hosting` +libraries which provide dependency injection via an `IServiceProvider`. + +The OpenTelemetry SDK and the Elastic distribution provide extension methods to enable observability +features in your application by adding a few lines of code. + +In this section, we'll focus on instrumenting an ASP.NET Core minimal API application using the Elastic +OpenTelemetry distribution. Similar steps can also be used to instrument other ASP.NET Core workloads +and other host-based applications such as [worker services](https://learn.microsoft.com/en-us/dotnet/core/extensions/workers). + +> **_NOTE:_** These examples assume the use of the top-level statements feature introduced in C# 9.0 and the +default choice for applications created using the latest templates. + +To take advantage of the OpenTelemetry SDK instrumentation for ASP.NET Core, add the following +NuGet package to your project: + +``` + +``` + +This package includes instrumentation to collect traces for requests handled by ASP.NET Core endpoints. + +> **_NOTE:_** The ASP.NET Core instrumentation is not included by default in the Elastic OpenTelemetry distribution. +As with all optional instrumentation libraries, you can choose to include them in your application by +adding a suitable package reference. + +Inside the `Program.cs` file of the ASP.NET Core application, add the following two using directives: + +```c# +using OpenTelemetry; +using OpenTelemetry.Trace; +``` + +The OpenTelemetry SDK provides extension methods on the `IServiceCollection` to support enabling the +providers and configuring the SDK. The Elastic distribution overrides the default SDK registration, +adding several opinionated defaults. + +In the minimal API template, the `WebApplicationBuilder` exposes a `Services` property that can be used +to register services with the dependency injection container. To enable tracing and metrics collection, +ensure that the OpenTelemetry SDK is registered. + +```c# +var builder = WebApplication.CreateBuilder(args); + +builder.Services + .AddHttpClient() <1> + .AddOpenTelemetry() <2> + .WithTracing(t => t.AddAspNetCoreInstrumentation()); <3> +``` +<1> The `AddHttpClient` method registers the `IHttpClientFactory` service with the dependency +injection container. This is NOT required to enable OpenTelemetry, but the example endpoint will use it to +send an HTTP request. + +<2> The `AddOpenTelemetry` method registers the OpenTelemetry SDK with the dependency injection +container. When available, the Elastic distribution will override this to add opinionated defaults. + +<3> Configure tracing to instrument requests handled by ASP.NET Core. + +With these limited changes to the `Program.cs` file, the application is now configured to use the +OpenTelemetry SDK and the Elastic distribution to collect traces and metrics, which are exported via +OTLP. + +To demonstrate the tracing capabilities, add a simple endpoint to the application: + +```c# +app.MapGet("/", async (IHttpClientFactory httpClientFactory) => +{ + using var client = httpClientFactory.CreateClient(); + + await Task.Delay(100); + var response = await client.GetAsync("http://elastic.co"); <1> + await Task.Delay(50); + + return response.StatusCode == System.Net.HttpStatusCode.OK ? Results.Ok() : Results.StatusCode(500); +}); +``` +<1> Using this URL will require two redirects, allowing us to see multiple spans in the trace. + +The Elastic distribution will automatically enable the exporting of signals via the OTLP exporter. This +exporter requires that endpoint(s) are configured. A common mechanism for configuring endpoints is +via environment variables. + +This demo uses an Elastic Cloud deployment as the destination for our observability data. From Kibana +running in Elastic Cloud, navigate to the observability set up guides. Select the OpenTelemetry option +to view the configuration details that should be supplied to the application. + +![Elastic Cloud OpenTelemetry configuration](docs/images/elastic-cloud-opentelemetry-configuration.png) + +Configure environment variables for the application either in `launchSettings.json` or in the environment +where the application is running. + +Once configured, run the application and make a request to the root endpoint. A trace will be generated +and exported to the OTLP endpoint. + +To view the traces, you can use the Elastic APM UI. + +![Minimal API request trace sample in the Elastic APM UI](docs/images/trace-sample-minimal-api.png) \ No newline at end of file diff --git a/docs/design-notes/design-required.md b/docs/design-notes/design-required.md deleted file mode 100644 index f926c22..0000000 --- a/docs/design-notes/design-required.md +++ /dev/null @@ -1,23 +0,0 @@ -# Design Required - -A list of problems which require further API design. - -## Item 1 - -What if a user wants to use the simplified AgentBuilder e.g: - -``` -using var agent = new AgentBuilder(ActivitySourceName).Build(); -``` - -but then wants to add one extra instrumentation (e.g. Redis)? This is achieved with an extension method -`AddRedisInstrumentation` on the TracerProviderBuilder. - -Right now, the consumer would have to use the more complex overload: - -``` -public AgentBuilder ConfigureTracer(Action configure) -``` - -This especially applies if we don't auto listen to ASP.NET Core which means that for very common scenarios, -users are forced to use the more complex overload. Is there anything we can do to make that easier? diff --git a/docs/design-notes/technical-issues.md b/docs/design-notes/technical-issues.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/design-notes/usage-scenarios.md b/docs/design-notes/usage-scenarios.md deleted file mode 100644 index 4b82c7a..0000000 --- a/docs/design-notes/usage-scenarios.md +++ /dev/null @@ -1,10 +0,0 @@ -# Usage Scenarios - -This document lists usage scenarios that consumers may have. Initially these will be manually verified, but -we should ensure that we introduce unit/integration tests before GA. - -## Scenario 1 - -A consumer wants to collect trace, metrics and/or logs and export them to Elastic APM with limited effort. They have -no specific requirements besides adding a custom `ActivitySource` name for their application. - diff --git a/docs/docs.csproj b/docs/docs.csproj index 568bf7d..b4ca8bf 100644 --- a/docs/docs.csproj +++ b/docs/docs.csproj @@ -1,4 +1,5 @@ + net8.0 False diff --git a/docs/getting-started.asciidoc b/docs/getting-started.asciidoc new file mode 100644 index 0000000..56dd08c --- /dev/null +++ b/docs/getting-started.asciidoc @@ -0,0 +1,155 @@ +[[getting-started]] +== Getting started + +This page will show you how to get started with Elastic OpenTelemetry distribution for .NET. + +As the distribution is a lightweight wrapper around the OpenTelemetry SDK, you should be broadly +familiar with the OpenTelemetry SDK concepts and instrumenting applications using the Microsoft +diagnostic APIs. If you are not, we recommend you read the +https://opentelemetry.io/docs/languages/net[OpenTelemetry SDK documentation] first. + +[IMPORTANT] +-- +The Elastic distribution is currently in early alpha release status. It is not yet feature +complete and may contain bugs. We are actively working on improving the distribution and +adding new features. + +If you would like to experience the alpha and help us improve the distribution by providing +early feedback, you can follow the steps below to get started. +-- + +=== Prerequisites + +The current documentation and examples are written with .NET 6 and newer applications in mind. +Before continuing, ensure that you have a supported +https://dotnet.microsoft.com/en-us/download/dotnet[.NET SDK version] installed locally. + +=== Installation + +To get started with the Elastic OpenTelemetry distribution, you must add the Elastic OpenTelemetry +NuGet package to your project. This can be achieved by adding the package reference to your project file. + +[source,xml] +---- + +---- + +After adding the package reference, you can start using the Elastic OpenTelemetry distribution +in your application. The distribution includes a transitive dependency on the OpenTelemetry SDK, +so you do not need to add the OpenTelemetry SDK package to your project, although doing so will +cause no harm and may be used to opt into newer SDK versions before the Elastic distribution +references them. + +The Elastic OpenTelemetry distribution is designed to be easy to use and integrate into your +applications. This includes applications which have previously used the OpenTelemetry SDK directly. +In situations where the OpenTelemetry SDK is already used, the only required change is +to add the `Elastic.OpenTelemetry` NuGet package to the project. Doing so will automatically +switch to the opinionated configuration provided by the Elastic distribution. + +=== ASP.NET Core usage + +A common requirement is to instrument ASP.NET Core applications based on the `Microsoft.Extensions.Hosting` +libraries which provide dependency injection via an `IServiceProvider`. + +The OpenTelemetry SDK and the Elastic distribution provide extension methods to enable observability +features in your application by adding a few lines of code. + +In this section, we'll focus on instrumenting an ASP.NET Core minimal API application using the Elastic +OpenTelemetry distribution. Similar steps can also be used to instrument other ASP.NET Core workloads +and other host-based applications such as https://learn.microsoft.com/en-us/dotnet/core/extensions/workers[worker services]. + +[NOTE] +-- +These examples assume the use of the top-level statements feature introduced in C# 9.0 and the +default choice for applications created using the latest templates. +-- + +To take advantage of the OpenTelemetry SDK instrumentation for ASP.NET Core, add the following +NuGet package to your project: + +[source,xml] +---- + +---- + +This package includes instrumentation to collect traces for requests handled by ASP.NET Core endpoints. + +[NOTE] +-- +The ASP.NET Core instrumentation is not included by default in the Elastic OpenTelemetry distribution. +As with all optional instrumentation libraries, you can choose to include them in your application by +adding a suitable package reference. +-- + +Inside the `Program.cs` file of the ASP.NET Core application, add the following two using directives: + +[source,csharp] +---- +using OpenTelemetry; +using OpenTelemetry.Trace; +---- + +The OpenTelemetry SDK provides extension methods on the `IServiceCollection` to support enabling the +providers and configuring the SDK. The Elastic distribution overrides the default SDK registration, +adding several opinionated defaults. + +In the minimal API template, the `WebApplicationBuilder` exposes a `Services` property that can be used +to register services with the dependency injection container. To enable tracing and metrics collection, +ensure that the OpenTelemetry SDK is registered. + +[source,csharp] +---- +var builder = WebApplication.CreateBuilder(args); + +builder.Services + .AddHttpClient() <1> + .AddOpenTelemetry() <2> + .WithTracing(t => t.AddAspNetCoreInstrumentation()); <3> +---- +<1> The `AddHttpClient` method registers the `IHttpClientFactory` service with the dependency +injection container. This is NOT required to enable OpenTelemetry, but the example endpoint will use it to +send an HTTP request. +<2> The `AddOpenTelemetry` method registers the OpenTelemetry SDK with the dependency injection +container. When available, the Elastic distribution will override this to add opinionated defaults. +<3> Configure tracing to instrument requests handled by ASP.NET Core. + +With these limited changes to the `Program.cs` file, the application is now configured to use the +OpenTelemetry SDK and the Elastic distribution to collect traces and metrics, which are exported via +OTLP. + +To demonstrate the tracing capabilities, add a simple endpoint to the application: + +[source,csharp] +---- +app.MapGet("/", async (IHttpClientFactory httpClientFactory) => +{ + using var client = httpClientFactory.CreateClient(); + + await Task.Delay(100); + var response = await client.GetAsync("http://elastic.co"); <1> + await Task.Delay(50); + + return response.StatusCode == System.Net.HttpStatusCode.OK ? Results.Ok() : Results.StatusCode(500); +}); +---- +<1> Using this URL will require two redirects, allowing us to see multiple spans in the trace. + +The Elastic distribution will automatically enable the exporting of signals via the OTLP exporter. This +exporter requires that endpoint(s) are configured. A common mechanism for configuring endpoints is +via environment variables. + +This demo uses an Elastic Cloud deployment as the destination for our observability data. From Kibana +running in Elastic Cloud, navigate to the observability set up guides. Select the OpenTelemetry option +to view the configuration details that should be supplied to the application. + +image::./images/elastic-cloud-opentelemetry-configuration.png[Elastic Cloud OpenTelemetry configuration] + +Configure environment variables for the application either in `launchSettings.json` or in the environment +where the application is running. + +Once configured, run the application and make a request to the root endpoint. A trace will be generated +and exported to the OTLP endpoint. + +To view the traces, you can use the Elastic APM UI. + +image::./images/trace-sample-minimal-api.png[Minimal API request trace sample in the Elastic APM UI] \ No newline at end of file diff --git a/docs/images/elastic-cloud-opentelemetry-configuration.png b/docs/images/elastic-cloud-opentelemetry-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..56405c5d2ce4340c08f63ae41b8e20a9b59d58ac GIT binary patch literal 133462 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
    )6x*`FrS69g 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ð}G6_U&+bIxbp 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 NkX4l_eEcHl{{e0vh_e6y literal 0 HcmV?d00001 diff --git a/docs/index.asciidoc b/docs/index.asciidoc index 801e145..76e0822 100644 --- a/docs/index.asciidoc +++ b/docs/index.asciidoc @@ -1,6 +1,8 @@ include::{asciidoc-dir}/../../shared/versions/stack/current.asciidoc[] include::{asciidoc-dir}/../../shared/attributes.asciidoc[] -= Elastic OpenTelemetry Agent Distribution += Elastic OpenTelemetry Distribution -Docs TODO +include::./intro.asciidoc[] + +include::./getting-started.asciidoc[] diff --git a/docs/intro.asciidoc b/docs/intro.asciidoc new file mode 100644 index 0000000..d799551 --- /dev/null +++ b/docs/intro.asciidoc @@ -0,0 +1,20 @@ +[[introduction]] +== Introduction + +The `Elastic.OpenTelemetry` package contains an Elastic distribution of the +https://opentelemetry.io/docs/languages/net[OpenTelemetry SDK for .NET]. A distribution +is a wrapper around an upstream OpenTelemetry repository with some customizations. For +more details about distributions in general, visit the +https://opentelemetry.io/docs/concepts/distributions[OpenTelemetry documentation]. + +The Elastic distribution includes some Elastic-specific processors to ensure the best +compatibility when exporting OpenTelemetry signal data to an Elastic backend such +as Elastic APM server. The distribution also preconfigures the collection of tracing +and metrics signals, applying some opinionated defaults, such as which sources are +collected by default. The distribution also ensures that the OTLP exporter is enabled +by default. + +The distribution includes extension methods to fully control the creation of the +underlying tracer and metric providers, providing a helpful set of defaults +to get developers up and running quickly with collecting and exporting OpenTelemetry +signals. \ No newline at end of file diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Controllers/E2EController.cs b/examples/Example.AspNetCore.Mvc/Controllers/E2EController.cs similarity index 95% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Controllers/E2EController.cs rename to examples/Example.AspNetCore.Mvc/Controllers/E2EController.cs index d088529..1d246b7 100644 --- a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Controllers/E2EController.cs +++ b/examples/Example.AspNetCore.Mvc/Controllers/E2EController.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Mvc; -namespace Example.Elastic.OpenTelemetry.AspNetCore.Controllers; +namespace Example.AspNetCore.Mvc.Controllers; public class E2EController : Controller { diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Controllers/HomeController.cs b/examples/Example.AspNetCore.Mvc/Controllers/HomeController.cs similarity index 91% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Controllers/HomeController.cs rename to examples/Example.AspNetCore.Mvc/Controllers/HomeController.cs index 6f1a26a..52db681 100644 --- a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Controllers/HomeController.cs +++ b/examples/Example.AspNetCore.Mvc/Controllers/HomeController.cs @@ -1,12 +1,13 @@ // Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information + using System.Diagnostics; using System.Net; -using Example.Elastic.OpenTelemetry.AspNetCore.Models; +using Example.AspNetCore.Mvc.Models; using Microsoft.AspNetCore.Mvc; -namespace Example.Elastic.OpenTelemetry.AspNetCore.Controllers; +namespace Example.AspNetCore.Mvc.Controllers; public class HomeController(IHttpClientFactory httpClientFactory) : Controller { diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Example.Elastic.OpenTelemetry.AspNetCore.csproj b/examples/Example.AspNetCore.Mvc/Example.AspNetCore.Mvc.csproj similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Example.Elastic.OpenTelemetry.AspNetCore.csproj rename to examples/Example.AspNetCore.Mvc/Example.AspNetCore.Mvc.csproj diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Models/ErrorViewModel.cs b/examples/Example.AspNetCore.Mvc/Models/ErrorViewModel.cs similarity index 85% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Models/ErrorViewModel.cs rename to examples/Example.AspNetCore.Mvc/Models/ErrorViewModel.cs index c8d130c..28575c2 100644 --- a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Models/ErrorViewModel.cs +++ b/examples/Example.AspNetCore.Mvc/Models/ErrorViewModel.cs @@ -1,7 +1,8 @@ // Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -namespace Example.Elastic.OpenTelemetry.AspNetCore.Models + +namespace Example.AspNetCore.Mvc.Models { public class ErrorViewModel { diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Program.cs b/examples/Example.AspNetCore.Mvc/Program.cs similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Program.cs rename to examples/Example.AspNetCore.Mvc/Program.cs diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Properties/launchSettings.json b/examples/Example.AspNetCore.Mvc/Properties/launchSettings.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Properties/launchSettings.json rename to examples/Example.AspNetCore.Mvc/Properties/launchSettings.json diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/E2E/Index.cshtml b/examples/Example.AspNetCore.Mvc/Views/E2E/Index.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/E2E/Index.cshtml rename to examples/Example.AspNetCore.Mvc/Views/E2E/Index.cshtml diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Home/Index.cshtml b/examples/Example.AspNetCore.Mvc/Views/Home/Index.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Home/Index.cshtml rename to examples/Example.AspNetCore.Mvc/Views/Home/Index.cshtml diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Home/Privacy.cshtml b/examples/Example.AspNetCore.Mvc/Views/Home/Privacy.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Home/Privacy.cshtml rename to examples/Example.AspNetCore.Mvc/Views/Home/Privacy.cshtml diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/Error.cshtml b/examples/Example.AspNetCore.Mvc/Views/Shared/Error.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/Error.cshtml rename to examples/Example.AspNetCore.Mvc/Views/Shared/Error.cshtml diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/_Layout.cshtml b/examples/Example.AspNetCore.Mvc/Views/Shared/_Layout.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/_Layout.cshtml rename to examples/Example.AspNetCore.Mvc/Views/Shared/_Layout.cshtml diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/_Layout.cshtml.css b/examples/Example.AspNetCore.Mvc/Views/Shared/_Layout.cshtml.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/_Layout.cshtml.css rename to examples/Example.AspNetCore.Mvc/Views/Shared/_Layout.cshtml.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/_ValidationScriptsPartial.cshtml b/examples/Example.AspNetCore.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/Shared/_ValidationScriptsPartial.cshtml rename to examples/Example.AspNetCore.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml diff --git a/examples/Example.AspNetCore.Mvc/Views/_ViewImports.cshtml b/examples/Example.AspNetCore.Mvc/Views/_ViewImports.cshtml new file mode 100644 index 0000000..a7d094c --- /dev/null +++ b/examples/Example.AspNetCore.Mvc/Views/_ViewImports.cshtml @@ -0,0 +1,2 @@ +@using Example.AspNetCore.Mvc.Models +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/_ViewStart.cshtml b/examples/Example.AspNetCore.Mvc/Views/_ViewStart.cshtml similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/_ViewStart.cshtml rename to examples/Example.AspNetCore.Mvc/Views/_ViewStart.cshtml diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/appsettings.Development.json b/examples/Example.AspNetCore.Mvc/appsettings.Development.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/appsettings.Development.json rename to examples/Example.AspNetCore.Mvc/appsettings.Development.json diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/appsettings.json b/examples/Example.AspNetCore.Mvc/appsettings.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/appsettings.json rename to examples/Example.AspNetCore.Mvc/appsettings.json diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/css/site.css b/examples/Example.AspNetCore.Mvc/wwwroot/css/site.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/css/site.css rename to examples/Example.AspNetCore.Mvc/wwwroot/css/site.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/favicon.ico b/examples/Example.AspNetCore.Mvc/wwwroot/favicon.ico similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/favicon.ico rename to examples/Example.AspNetCore.Mvc/wwwroot/favicon.ico diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/js/site.js b/examples/Example.AspNetCore.Mvc/wwwroot/js/site.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/js/site.js rename to examples/Example.AspNetCore.Mvc/wwwroot/js/site.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/LICENSE b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/LICENSE similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/LICENSE rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/LICENSE diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/LICENSE.md b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/LICENSE.md similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/LICENSE.md rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/LICENSE.md diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/additional-methods.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/additional-methods.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/additional-methods.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/additional-methods.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/additional-methods.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/additional-methods.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/additional-methods.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/jquery.validate.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/jquery.validate.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/jquery.validate.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/LICENSE.txt b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/LICENSE.txt similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/LICENSE.txt rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/LICENSE.txt diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/dist/jquery.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/dist/jquery.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/dist/jquery.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/dist/jquery.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/dist/jquery.min.js b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/dist/jquery.min.js similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/dist/jquery.min.js rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/dist/jquery.min.js diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/dist/jquery.min.map b/examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/dist/jquery.min.map similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.AspNetCore/wwwroot/lib/jquery/dist/jquery.min.map rename to examples/Example.AspNetCore.Mvc/wwwroot/lib/jquery/dist/jquery.min.map diff --git a/examples/Example.Elastic.OpenTelemetry/Example.Elastic.OpenTelemetry.csproj b/examples/Example.Console/Example.Console.csproj similarity index 100% rename from examples/Example.Elastic.OpenTelemetry/Example.Elastic.OpenTelemetry.csproj rename to examples/Example.Console/Example.Console.csproj diff --git a/examples/Example.Elastic.OpenTelemetry/Program.cs b/examples/Example.Console/Program.cs similarity index 90% rename from examples/Example.Elastic.OpenTelemetry/Program.cs rename to examples/Example.Console/Program.cs index 4544a3a..9c895d1 100644 --- a/examples/Example.Elastic.OpenTelemetry/Program.cs +++ b/examples/Example.Console/Program.cs @@ -1,7 +1,8 @@ // Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -using Example.Elastic.OpenTelemetry; + +using Example.Console; Console.WriteLine("Starting sample application."); diff --git a/examples/Example.Elastic.OpenTelemetry/Properties/launchSettings.json b/examples/Example.Console/Properties/launchSettings.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry/Properties/launchSettings.json rename to examples/Example.Console/Properties/launchSettings.json diff --git a/examples/Example.Elastic.OpenTelemetry/Usage.cs b/examples/Example.Console/Usage.cs similarity index 99% rename from examples/Example.Elastic.OpenTelemetry/Usage.cs rename to examples/Example.Console/Usage.cs index e8b7026..d49eb8c 100644 --- a/examples/Example.Elastic.OpenTelemetry/Usage.cs +++ b/examples/Example.Console/Usage.cs @@ -1,6 +1,7 @@ // Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information + using System.Diagnostics; using Elastic.OpenTelemetry; using Elastic.OpenTelemetry.Extensions; @@ -8,7 +9,7 @@ using OpenTelemetry.Resources; using OpenTelemetry.Trace; -namespace Example.Elastic.OpenTelemetry; +namespace Example.Console; internal static class Usage { diff --git a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/_ViewImports.cshtml b/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/_ViewImports.cshtml deleted file mode 100644 index 7da3ade..0000000 --- a/examples/Example.Elastic.OpenTelemetry.AspNetCore/Views/_ViewImports.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@using Example.Elastic.OpenTelemetry.AspNetCore -@using Example.Elastic.OpenTelemetry.AspNetCore.Models -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/examples/Example.MinimalApi/Example.MinimalApi.csproj b/examples/Example.MinimalApi/Example.MinimalApi.csproj new file mode 100644 index 0000000..2c0fd90 --- /dev/null +++ b/examples/Example.MinimalApi/Example.MinimalApi.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/examples/Example.MinimalApi/Program.cs b/examples/Example.MinimalApi/Program.cs new file mode 100644 index 0000000..07542c6 --- /dev/null +++ b/examples/Example.MinimalApi/Program.cs @@ -0,0 +1,57 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using System.Diagnostics; +using Example.Api; +using OpenTelemetry; +using OpenTelemetry.Trace; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services + .AddHttpClient() // Adds IHttpClientFactory + .AddOpenTelemetry() // Adds the OpenTelemetry SDK + .WithTracing(t => + { + t.AddAspNetCoreInstrumentation(); // Configure tracing to instrument ASP.NET Core + t.AddSource(Api.ActivitySourceName); + }); + +var app = builder.Build(); + +app.UseHttpsRedirection(); + +app.MapGet("/", (IHttpClientFactory httpClientFactory) => Api.HandleRoot(httpClientFactory)); + +app.Run(); + +namespace Example.Api +{ + internal static class Api + { + public static string ActivitySourceName = "CustomActivitySource"; + private static readonly ActivitySource ActivitySource = new(ActivitySourceName); + + public static async Task HandleRoot(IHttpClientFactory httpClientFactory) + { + using var client = httpClientFactory.CreateClient(); + + using var activity = ActivitySource.StartActivity("DoingStuff", ActivityKind.Internal); + activity?.SetTag("custom-tag", "TagValue"); + + await Task.Delay(100); + var response = await client.GetAsync("http://elastic.co"); // using this URL will require 2 redirects + await Task.Delay(50); + + if (response.StatusCode == System.Net.HttpStatusCode.OK) + { + activity?.SetStatus(ActivityStatusCode.Ok); + return Results.Ok(); + } + + activity?.SetStatus(ActivityStatusCode.Error); + return Results.StatusCode(500); + } + } +} diff --git a/examples/Example.MinimalApi/Properties/launchSettings.json b/examples/Example.MinimalApi/Properties/launchSettings.json new file mode 100644 index 0000000..cb647e9 --- /dev/null +++ b/examples/Example.MinimalApi/Properties/launchSettings.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:4214", + "sslPort": 44348 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "", + "applicationUrl": "http://localhost:5146", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "OTEL_RESOURCE_ATTRIBUTES": "service.name=minimal-api-example" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "", + "applicationUrl": "https://localhost:7140;http://localhost:5146", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "OTEL_RESOURCE_ATTRIBUTES": "service.name=minimal-api-example" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "OTEL_RESOURCE_ATTRIBUTES": "service.name=minimal-api-example" + } + } + } +} diff --git a/examples/Example.MinimalApi/appsettings.Development.json b/examples/Example.MinimalApi/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/examples/Example.MinimalApi/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/examples/Example.MinimalApi/appsettings.json b/examples/Example.MinimalApi/appsettings.json new file mode 100644 index 0000000..9bba77a --- /dev/null +++ b/examples/Example.MinimalApi/appsettings.json @@ -0,0 +1,13 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ServiceName": "elastic-minimal-api-example", + "AspNetCoreInstrumentation": { + "RecordException": "true" + } +} diff --git a/examples/Example.Elastic.OpenTelemetry.Worker/Example.Elastic.OpenTelemetry.Worker.csproj b/examples/Example.WorkerService/Example.WorkerService.csproj similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.Worker/Example.Elastic.OpenTelemetry.Worker.csproj rename to examples/Example.WorkerService/Example.WorkerService.csproj diff --git a/examples/Example.Elastic.OpenTelemetry.Worker/Program.cs b/examples/Example.WorkerService/Program.cs similarity index 93% rename from examples/Example.Elastic.OpenTelemetry.Worker/Program.cs rename to examples/Example.WorkerService/Program.cs index e69dcb2..773ce0c 100644 --- a/examples/Example.Elastic.OpenTelemetry.Worker/Program.cs +++ b/examples/Example.WorkerService/Program.cs @@ -2,7 +2,7 @@ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -using Example.Elastic.OpenTelemetry.Worker; +using Example.WorkerService; using OpenTelemetry; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; diff --git a/examples/Example.Elastic.OpenTelemetry.Worker/Properties/launchSettings.json b/examples/Example.WorkerService/Properties/launchSettings.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.Worker/Properties/launchSettings.json rename to examples/Example.WorkerService/Properties/launchSettings.json diff --git a/examples/Example.Elastic.OpenTelemetry.Worker/Worker.cs b/examples/Example.WorkerService/Worker.cs similarity index 97% rename from examples/Example.Elastic.OpenTelemetry.Worker/Worker.cs rename to examples/Example.WorkerService/Worker.cs index a587058..b3b0792 100644 --- a/examples/Example.Elastic.OpenTelemetry.Worker/Worker.cs +++ b/examples/Example.WorkerService/Worker.cs @@ -1,10 +1,11 @@ // Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information + using System.Diagnostics; using System.Diagnostics.Metrics; -namespace Example.Elastic.OpenTelemetry.Worker; +namespace Example.WorkerService; public class Worker(ILogger logger) : BackgroundService { diff --git a/examples/Example.Elastic.OpenTelemetry.Worker/appsettings.Development.json b/examples/Example.WorkerService/appsettings.Development.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.Worker/appsettings.Development.json rename to examples/Example.WorkerService/appsettings.Development.json diff --git a/examples/Example.Elastic.OpenTelemetry.Worker/appsettings.json b/examples/Example.WorkerService/appsettings.json similarity index 100% rename from examples/Example.Elastic.OpenTelemetry.Worker/appsettings.json rename to examples/Example.WorkerService/appsettings.json diff --git a/src/Elastic.OpenTelemetry/AgentBuilder.cs b/src/Elastic.OpenTelemetry/AgentBuilder.cs index b78143f..6b01501 100644 --- a/src/Elastic.OpenTelemetry/AgentBuilder.cs +++ b/src/Elastic.OpenTelemetry/AgentBuilder.cs @@ -10,49 +10,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using OpenTelemetry; -using OpenTelemetry.Exporter; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; namespace Elastic.OpenTelemetry; - -/// -/// Expert options to provide to to control its initial OpenTelemetry registration -/// -public record AgentBuilderOptions -{ - /// - /// Provide an additional logger to the internal file logger. - /// - /// The agent will always log to file if a Path is provided using the ELASTIC_OTEL_LOG_DIRECTORY - /// environment variable. - /// - public ILogger? Logger { get; init; } - - /// - /// Provides an to register the agent into. - /// If null a new local instance will be used. - /// - public IServiceCollection? Services { get; init; } - - /// - /// The initial activity sources to listen to. - /// >These can always later be amended with - /// - public string[] ActivitySources { get; init; } = []; - - /// - /// Stops to register OLTP exporters, useful for testing scenarios - /// - public bool SkipOtlpExporter { get; init; } - - /// - /// Optional name which is used when retrieving OTLP options. - /// - public string? OtlpExporterName { get; init; } -} - /// /// Supports building instances which include Elastic defaults, but can also be customised. /// @@ -116,7 +78,6 @@ public AgentBuilder(AgentBuilderOptions options) metrics.AddMeter(source); } - metrics .AddProcessInstrumentation() .AddRuntimeInstrumentation() @@ -134,11 +95,7 @@ public AgentBuilder(AgentBuilderOptions options) { if (!options.SkipOtlpExporter) { - metrics.AddOtlpExporter(options.OtlpExporterName, o => - { - o.ExportProcessorType = ExportProcessorType.Simple; - o.Protocol = OtlpExportProtocol.HttpProtobuf; - }); + metrics.AddOtlpExporter(options.OtlpExporterName, _ => { }); } Logger.LogAgentBuilderBuiltMeterProvider(); }); diff --git a/src/Elastic.OpenTelemetry/AgentBuilderOptions.cs b/src/Elastic.OpenTelemetry/AgentBuilderOptions.cs new file mode 100644 index 0000000..23f5520 --- /dev/null +++ b/src/Elastic.OpenTelemetry/AgentBuilderOptions.cs @@ -0,0 +1,45 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using OpenTelemetry.Trace; + +namespace Elastic.OpenTelemetry; + +/// +/// Expert options to provide to to control its initial OpenTelemetry registration +/// +public record AgentBuilderOptions +{ + /// + /// Provide an additional logger to the internal file logger. + /// + /// The agent will always log to file if a Path is provided using the ELASTIC_OTEL_LOG_DIRECTORY + /// environment variable. + /// + public ILogger? Logger { get; init; } + + /// + /// Provides an to register the agent into. + /// If null a new local instance will be used. + /// + public IServiceCollection? Services { get; init; } + + /// + /// The initial activity sources to listen to. + /// >These can always later be amended with + /// + public string[] ActivitySources { get; init; } = []; + + /// + /// Stops to register OLTP exporters, useful for testing scenarios + /// + public bool SkipOtlpExporter { get; init; } + + /// + /// Optional name which is used when retrieving OTLP options. + /// + public string? OtlpExporterName { get; init; } +} diff --git a/src/Elastic.OpenTelemetry/DependencyInjection/ServiceCollectionExtensions.cs b/src/Elastic.OpenTelemetry/DependencyInjection/ServiceCollectionExtensions.cs index 4728232..20135c2 100644 --- a/src/Elastic.OpenTelemetry/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/Elastic.OpenTelemetry/DependencyInjection/ServiceCollectionExtensions.cs @@ -42,11 +42,10 @@ public static IOpenTelemetryBuilder AddElasticOpenTelemetry(this IServiceCollect { if (serviceCollection.Any(d => d.ServiceType == typeof(IHostedService) && d.ImplementationType == typeof(ElasticOtelDistroService))) { + // TODO - Can we avoid this by storing the instance on the builder (internal access) var sp = serviceCollection.BuildServiceProvider(); return sp.GetService()!; //already registered as singleton } return new AgentBuilder(options); } - - } diff --git a/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DistributedApplicationFixture.cs b/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DistributedApplicationFixture.cs index 352ee4e..44b584c 100644 --- a/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DistributedApplicationFixture.cs +++ b/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DistributedApplicationFixture.cs @@ -6,9 +6,7 @@ using System.Security.Cryptography; using System.Text; using Microsoft.Extensions.Configuration; -using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Nullean.Xunit.Partitions.Sdk; -using Xunit.Sdk; namespace Elastic.OpenTelemetry.EndToEndTests.DistributedFixture; @@ -20,7 +18,7 @@ public class DistributedApplicationFixture : IPartitionLifetime public bool Started => AspNetApplication?.ProcessId.HasValue ?? false; - private readonly List _output = new(); + private readonly List _output = []; public int? MaxConcurrency => null; @@ -55,7 +53,7 @@ public string FailureTestOutput() { var logLines = new List(); if (_aspNetApplication?.ProcessId.HasValue ?? false) - AspNetApplication.IterateOverLog(s => + DotNetRunApplication.IterateOverLog(s => { Console.WriteLine(s); logLines.Add(s); @@ -113,13 +111,12 @@ public async Task InitializeAsync() await ApmUI.InitializeAsync(); } - } public class AspNetCoreExampleApplication : DotNetRunApplication { public AspNetCoreExampleApplication(string serviceName, IConfiguration configuration) - : base(serviceName, configuration, "Example.Elastic.OpenTelemetry.AspNetCore") => + : base(serviceName, configuration, "Example.AspNetCore.Mvc") => HttpClient = new HttpClient { BaseAddress = new Uri("http://localhost:5247") }; public HttpClient HttpClient { get; } diff --git a/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DotNetRunApplication.cs b/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DotNetRunApplication.cs index c9d4aef..f112b3c 100644 --- a/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DotNetRunApplication.cs +++ b/tests/Elastic.OpenTelemetry.EndToEndTests/DistributedFixture/DotNetRunApplication.cs @@ -36,7 +36,7 @@ protected DotNetRunApplication(string serviceName, IConfiguration configuration, public int? ProcessId { get; private set; } - protected virtual string[] GetArguments() => Array.Empty(); + protected virtual string[] GetArguments() => []; public static DirectoryInfo GetSolutionRoot() { @@ -61,7 +61,6 @@ private LongRunningArguments CreateStartArgs() return new("dotnet", arguments) { - Environment = new Dictionary { { "OTEL_EXPORTER_OTLP_ENDPOINT", _endpoint }, @@ -88,20 +87,18 @@ private LongRunningArguments CreateStartArgs() return l.Line.StartsWith(" Application started."); } }; - - } - public void IterateOverLog(Action write) + public static void IterateOverLog(Action write) { - var logFile = DotNetRunApplication.LogDirectory + var logFile = LogDirectory //TODO get last of this app specifically //.GetFiles($"{_app.Process.Binary}_*.log") .GetFiles($"*.log") .MaxBy(f => f.CreationTimeUtc); if (logFile == null) - write($"Could not locate log files in {DotNetRunApplication.LogDirectory}"); + write($"Could not locate log files in {LogDirectory}"); else { write($"Contents of: {logFile.FullName}"); diff --git a/tests/Elastic.OpenTelemetry.EndToEndTests/ServiceTests.cs b/tests/Elastic.OpenTelemetry.EndToEndTests/ServiceTests.cs index 8725a6f..6f39281 100644 --- a/tests/Elastic.OpenTelemetry.EndToEndTests/ServiceTests.cs +++ b/tests/Elastic.OpenTelemetry.EndToEndTests/ServiceTests.cs @@ -45,6 +45,6 @@ public async Task DisposeAsync() if (!success) return; - fixture.AspNetApplication.IterateOverLog(Output.WriteLine); + DotNetRunApplication.IterateOverLog(Output.WriteLine); } }