add prototype developed by Anastasia
This commit is contained in:
Родитель
0b9ca2cb6e
Коммит
d5ab49e1fe
|
@ -0,0 +1,32 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.22609.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{2E6DDE9E-8C75-4F9C-8906-08EBDD6E73EF}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{62AD20FD-640F-4F99-94EF-96A7581F1CF9}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
global.json = global.json
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.ApplicationInsights.Middleware", "src\AI.MW.P2\Microsoft.ApplicationInsights.Middleware.kproj", "{95EC3635-22E4-4C3A-A066-F5823A0648DA}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{95EC3635-22E4-4C3A-A066-F5823A0648DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{95EC3635-22E4-4C3A-A066-F5823A0648DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{95EC3635-22E4-4C3A-A066-F5823A0648DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{95EC3635-22E4-4C3A-A066-F5823A0648DA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{95EC3635-22E4-4C3A-A066-F5823A0648DA} = {2E6DDE9E-8C75-4F9C-8906-08EBDD6E73EF}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"sources": [ "src", "test" ],
|
||||
"sdk": {
|
||||
"version": "1.0.0-beta3"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,155 @@
|
|||
using Microsoft.ApplicationInsights;
|
||||
using Microsoft.ApplicationInsights.DataContracts;
|
||||
using Microsoft.ApplicationInsights.Extensibility;
|
||||
using Microsoft.AspNet.Builder;
|
||||
using Microsoft.AspNet.Hosting;
|
||||
using Microsoft.AspNet.Http;
|
||||
using Microsoft.AspNet.RequestContainer;
|
||||
using Microsoft.Framework.ConfigurationModel;
|
||||
using Microsoft.Framework.DependencyInjection;
|
||||
using Microsoft.Framework.Logging;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.ApplicationInsights.Middleware
|
||||
{
|
||||
public static class ApplicationInsightsExtensions
|
||||
{
|
||||
public static void AddTelemetryClient(this IServiceCollection serviceCollection, IConfiguration configuration)
|
||||
{
|
||||
serviceCollection.AddScoped(sp => RegisterClient(sp, configuration));
|
||||
}
|
||||
|
||||
public static void UseApplicationInsightsForRequests(this IApplicationBuilder app)
|
||||
{
|
||||
app.UseMiddleware<AppInsightsRequestMiddleware>();
|
||||
}
|
||||
|
||||
public static void UseApplicationInsightsForExceptions(this IApplicationBuilder app)
|
||||
{
|
||||
app.UseMiddleware<AppInsightsExceptionMiddleware>();
|
||||
}
|
||||
|
||||
private static TelemetryClient RegisterClient(IServiceProvider serviceProvider, IConfiguration configuration)
|
||||
{
|
||||
TelemetryClient client = null;
|
||||
try
|
||||
{
|
||||
string key = configuration.Get("InstrumentationKey");
|
||||
|
||||
if (string.IsNullOrEmpty(key))
|
||||
{
|
||||
// TODO; check logger for null
|
||||
serviceProvider.GetService<ILogger>().WriteError("InstrumentationKey not registered");
|
||||
return null;
|
||||
}
|
||||
|
||||
var aiConfig = new TelemetryConfiguration();
|
||||
aiConfig.InstrumentationKey = key;
|
||||
var channel = new Channel.InProcessTelemetryChannel();
|
||||
aiConfig.TelemetryChannel = channel;
|
||||
|
||||
var env = serviceProvider.GetService<IHostingEnvironment>();
|
||||
|
||||
if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
aiConfig.TelemetryChannel.DeveloperMode = true;
|
||||
}
|
||||
|
||||
client = new TelemetryClient(aiConfig);
|
||||
channel.Initialize(aiConfig);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
serviceProvider.GetService<ILogger>().WriteError(e.ToString());
|
||||
}
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
private class AppInsightsRequestMiddleware
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
private readonly IServiceProvider _services;
|
||||
|
||||
public AppInsightsRequestMiddleware(RequestDelegate next, IServiceProvider services)
|
||||
{
|
||||
_services = services;
|
||||
_next = next;
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext httpContext)
|
||||
{
|
||||
using (var container = RequestServicesContainer.EnsureRequestServices(httpContext, _services))
|
||||
{
|
||||
var client = httpContext.RequestServices.GetService<TelemetryClient>();
|
||||
|
||||
if (client == null)
|
||||
{
|
||||
_services.GetService<ILogger>().WriteError("AI TelemetryClient is not registered.");
|
||||
}
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
|
||||
try
|
||||
{
|
||||
await _next.Invoke(httpContext);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (client != null)
|
||||
{
|
||||
var telemetry = new RequestTelemetry(
|
||||
httpContext.Request.Method + " " + httpContext.Request.Path.Value,
|
||||
now,
|
||||
DateTime.UtcNow - now,
|
||||
httpContext.Response.StatusCode.ToString(),
|
||||
httpContext.Response.StatusCode < 400);
|
||||
|
||||
client.TrackRequest(telemetry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class AppInsightsExceptionMiddleware
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
private readonly IServiceProvider _services;
|
||||
|
||||
public AppInsightsExceptionMiddleware(RequestDelegate next, IServiceProvider services)
|
||||
{
|
||||
_services = services;
|
||||
_next = next;
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext httpContext)
|
||||
{
|
||||
using (var container = RequestServicesContainer.EnsureRequestServices(httpContext, _services))
|
||||
{
|
||||
var client = httpContext.RequestServices.GetService<TelemetryClient>();
|
||||
|
||||
if (client == null)
|
||||
{
|
||||
_services.GetService<ILogger>().WriteWarning("AI TelemetryClient is not registered.");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await _next.Invoke(httpContext);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
if (client != null)
|
||||
{
|
||||
client.TrackException(exp);
|
||||
}
|
||||
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>95ec3635-22e4-4c3a-a066-f5823a0648da</ProjectGuid>
|
||||
<RootNamespace>Microsoft.ApplicationInsights.Middleware</RootNamespace>
|
||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<AssemblyName>Microsoft.ApplicationInsights.Middleware</AssemblyName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||
</Project>
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"version": "0.30.0.1-beta",
|
||||
"dependencies": {
|
||||
"Microsoft.AspNet.Hosting": "1.0.0-beta3",
|
||||
"Microsoft.Framework.Logging": "1.0.0-beta3",
|
||||
"Microsoft.AspNet.Http.Extensions": "1.0.0-beta3",
|
||||
"Microsoft.AspNet.RequestContainer": "1.0.0-beta3",
|
||||
"Microsoft.ApplicationInsights.Portable": "0.30.0.0-beta"
|
||||
},
|
||||
|
||||
"frameworks" : {
|
||||
"aspnet50" : {
|
||||
"dependencies": {
|
||||
}
|
||||
},
|
||||
"aspnetcore50" : {
|
||||
"dependencies": {
|
||||
"System.Runtime": "4.0.20-*"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче