Unverified Commit 38e00071 authored by Lemon's avatar Lemon Committed by GitHub

[refactor] Remove Microsoft.Extensions.Http (#36)

* Add HttpExceptionHandler in SkyWalking.Diagnostics.HttpClient

* Fix IgnoredTracerContext

* Add unit tests for SkyWalking.Diagnostics.HttpClient

* Refactor remote services

* Fix HostingDiagnosticProcessor

* Add parametar binding for CapDiagnosticProcessor

* Remove Microsoft.Extensions.Http

* Update HttpClientDiagnosticTests.cs

* Todo fix ci
parent 1fb4378d
...@@ -42,6 +42,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkyWalking.Extensions.Depen ...@@ -42,6 +42,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkyWalking.Extensions.Depen
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkyWalking.Diagnostics.CAP", "src\SkyWalking.Diagnostics.CAP\SkyWalking.Diagnostics.CAP.csproj", "{55621423-19C3-4928-8B45-666FA87BF6A2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkyWalking.Diagnostics.CAP", "src\SkyWalking.Diagnostics.CAP\SkyWalking.Diagnostics.CAP.csproj", "{55621423-19C3-4928-8B45-666FA87BF6A2}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkyWalking.Diagnostics.HttpClient.Tests", "test\SkyWalking.Diagnostics.HttpClient.Tests\SkyWalking.Diagnostics.HttpClient.Tests.csproj", "{05E533B1-473F-48C0-95F7-B87061BE9834}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
...@@ -92,6 +94,10 @@ Global ...@@ -92,6 +94,10 @@ Global
{55621423-19C3-4928-8B45-666FA87BF6A2}.Debug|Any CPU.Build.0 = Debug|Any CPU {55621423-19C3-4928-8B45-666FA87BF6A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55621423-19C3-4928-8B45-666FA87BF6A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {55621423-19C3-4928-8B45-666FA87BF6A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55621423-19C3-4928-8B45-666FA87BF6A2}.Release|Any CPU.Build.0 = Release|Any CPU {55621423-19C3-4928-8B45-666FA87BF6A2}.Release|Any CPU.Build.0 = Release|Any CPU
{05E533B1-473F-48C0-95F7-B87061BE9834}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{05E533B1-473F-48C0-95F7-B87061BE9834}.Debug|Any CPU.Build.0 = Debug|Any CPU
{05E533B1-473F-48C0-95F7-B87061BE9834}.Release|Any CPU.ActiveCfg = Release|Any CPU
{05E533B1-473F-48C0-95F7-B87061BE9834}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
...@@ -110,6 +116,7 @@ Global ...@@ -110,6 +116,7 @@ Global
{49DEFCA8-4289-4875-B6A5-35D84B3D2290} = {79ED86A5-E9B9-49B2-9354-C911C079D03E} {49DEFCA8-4289-4875-B6A5-35D84B3D2290} = {79ED86A5-E9B9-49B2-9354-C911C079D03E}
{BF5579ED-113C-4EE6-AE03-9A9CA590C924} = {79ED86A5-E9B9-49B2-9354-C911C079D03E} {BF5579ED-113C-4EE6-AE03-9A9CA590C924} = {79ED86A5-E9B9-49B2-9354-C911C079D03E}
{55621423-19C3-4928-8B45-666FA87BF6A2} = {79ED86A5-E9B9-49B2-9354-C911C079D03E} {55621423-19C3-4928-8B45-666FA87BF6A2} = {79ED86A5-E9B9-49B2-9354-C911C079D03E}
{05E533B1-473F-48C0-95F7-B87061BE9834} = {613F0980-91ED-4064-8E8C-168582EF4AD7}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {94C0DA2C-CCCB-4314-93A2-9809B5DD0583} SolutionGuid = {94C0DA2C-CCCB-4314-93A2-9809B5DD0583}
......
...@@ -30,14 +30,8 @@ namespace SkyWalking.AspNetCore.Diagnostics ...@@ -30,14 +30,8 @@ namespace SkyWalking.AspNetCore.Diagnostics
{ {
public string ListenerName { get; } = "Microsoft.AspNetCore"; public string ListenerName { get; } = "Microsoft.AspNetCore";
[DiagnosticName("Microsoft.AspNetCore.Hosting.HttpRequestIn")] [DiagnosticName("Microsoft.AspNetCore.Hosting.BeginRequest")]
public void HttpRequestIn() public void BeginRequest([Property]HttpContext httpContext)
{
// do nothing, just enable the diagnotic source
}
[DiagnosticName("Microsoft.AspNetCore.Hosting.HttpRequestIn.Start")]
public void HttpRequestInStart(HttpContext httpContext)
{ {
var carrier = new ContextCarrier(); var carrier = new ContextCarrier();
foreach (var item in carrier.Items) foreach (var item in carrier.Items)
...@@ -50,8 +44,8 @@ namespace SkyWalking.AspNetCore.Diagnostics ...@@ -50,8 +44,8 @@ namespace SkyWalking.AspNetCore.Diagnostics
Tags.HTTP.Method.Set(httpRequestSpan, httpContext.Request.Method); Tags.HTTP.Method.Set(httpRequestSpan, httpContext.Request.Method);
} }
[DiagnosticName("Microsoft.AspNetCore.Hosting.HttpRequestIn.Stop")] [DiagnosticName("Microsoft.AspNetCore.Hosting.EndRequest")]
public void HttpRequestInStop(HttpContext httpContext) public void EndRequest([Property]HttpContext httpContext)
{ {
var httpRequestSpan = ContextManager.ActiveSpan; var httpRequestSpan = ContextManager.ActiveSpan;
if (httpRequestSpan == null) if (httpRequestSpan == null)
...@@ -67,12 +61,6 @@ namespace SkyWalking.AspNetCore.Diagnostics ...@@ -67,12 +61,6 @@ namespace SkyWalking.AspNetCore.Diagnostics
ContextManager.StopSpan(httpRequestSpan); ContextManager.StopSpan(httpRequestSpan);
} }
[DiagnosticName("Microsoft.AspNetCore.Diagnostics.HandledException")]
public void DiagnosticHandledException(HttpContext httpContext, Exception exception)
{
ContextManager.ActiveSpan.ErrorOccurred();
}
[DiagnosticName("Microsoft.AspNetCore.Diagnostics.UnhandledException")] [DiagnosticName("Microsoft.AspNetCore.Diagnostics.UnhandledException")]
public void DiagnosticUnhandledException(HttpContext httpContext, Exception exception) public void DiagnosticUnhandledException(HttpContext httpContext, Exception exception)
{ {
...@@ -80,7 +68,7 @@ namespace SkyWalking.AspNetCore.Diagnostics ...@@ -80,7 +68,7 @@ namespace SkyWalking.AspNetCore.Diagnostics
} }
[DiagnosticName("Microsoft.AspNetCore.Hosting.UnhandledException")] [DiagnosticName("Microsoft.AspNetCore.Hosting.UnhandledException")]
public void HostingUnhandledException(HttpContext httpContext, Exception exception) public void HostingUnhandledException([Property]HttpContext httpContext, [Property]Exception exception)
{ {
ContextManager.ActiveSpan.ErrorOccurred(); ContextManager.ActiveSpan.ErrorOccurred();
} }
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Http;
using SkyWalking.AspNetCore.Diagnostics; using SkyWalking.AspNetCore.Diagnostics;
using SkyWalking.AspNetCore.Logging; using SkyWalking.AspNetCore.Logging;
using SkyWalking.Diagnostics; using SkyWalking.Diagnostics;
...@@ -42,12 +41,5 @@ namespace SkyWalking.AspNetCore ...@@ -42,12 +41,5 @@ namespace SkyWalking.AspNetCore
builder.Services.AddSingleton<TracingDiagnosticProcessorObserver>(); builder.Services.AddSingleton<TracingDiagnosticProcessorObserver>();
return builder; return builder;
} }
public static SkyWalkingBuilder AddHttpClientFactory(this SkyWalkingBuilder builder)
{
builder.Services.AddHttpClient<TracingHttpClient>();
builder.Services.AddTransient<HttpMessageHandlerBuilder, TracingHttpMessageHandlerBuilder>();
return builder;
}
} }
} }
\ No newline at end of file
...@@ -15,9 +15,6 @@ ...@@ -15,9 +15,6 @@
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.1.0-preview2-final" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.1.0-preview2-final" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.1.0-preview2-final" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
......
/*
* Licensed to the OpenSkywalking under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using System.Net.Http;
namespace SkyWalking.AspNetCore
{
public class TracingHttpClient
{
public HttpClient HttpClient { get; }
public TracingHttpClient(HttpClient httpClient)
{
HttpClient = httpClient;
}
}
}
\ No newline at end of file
/*
* Licensed to the OpenSkywalking under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using SkyWalking.Context;
using SkyWalking.Context.Tag;
using SkyWalking.Context.Trace;
using SkyWalking.NetworkProtocol.Trace;
namespace SkyWalking.AspNetCore
{
public class TracingHttpHandler : DelegatingHandler
{
public TracingHttpHandler()
{
InnerHandler = new HttpClientHandler();
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
var contextCarrier = new ContextCarrier();
var peer = $"{request.RequestUri.Host}:{request.RequestUri.Port}";
var span = ContextManager.CreateExitSpan(request.RequestUri.ToString(), contextCarrier, peer);
Tags.Url.Set(span, request.RequestUri.ToString());
span.AsHttp();
span.SetComponent(ComponentsDefine.HttpClient);
Tags.HTTP.Method.Set(span, request.Method.ToString());
foreach (var item in contextCarrier.Items)
request.Headers.Add(item.HeadKey, item.HeadValue);
var response = await base.SendAsync(request, cancellationToken);
Tags.StatusCode.Set(span, response.StatusCode.ToString());
ContextManager.StopSpan(span);
return response;
}
}
}
\ No newline at end of file
/*
* Licensed to the OpenSkywalking under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
using System;
using System.Collections.Generic;
using System.Net.Http;
using Microsoft.Extensions.Http;
namespace SkyWalking.AspNetCore
{
internal class TracingHttpMessageHandlerBuilder : HttpMessageHandlerBuilder
{
private readonly TracingHttpHandler _primaryHandler = new TracingHttpHandler();
private string _name;
public override string Name
{
get => _name;
set => _name = value ?? throw new ArgumentNullException(nameof(value));
}
public override IList<DelegatingHandler> AdditionalHandlers { get; } = new List<DelegatingHandler>();
public override HttpMessageHandler Build()
{
if (PrimaryHandler == null)
{
throw new InvalidOperationException();
}
return CreateHandlerPipeline(PrimaryHandler, AdditionalHandlers);
}
public override HttpMessageHandler PrimaryHandler
{
get => _primaryHandler;
set
{
if (value != null)
{
_primaryHandler.InnerHandler = value;
}
}
}
}
}
\ No newline at end of file
...@@ -19,15 +19,16 @@ ...@@ -19,15 +19,16 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using SkyWalking.Context.Trace; using SkyWalking.Context.Trace;
using SkyWalking.Utils;
namespace SkyWalking.Context namespace SkyWalking.Context
{ {
public class IgnoredTracerContext : ITracerContext public class IgnoredTracerContext : ITracerContext
{ {
private static readonly NoopSpan noopSpan = new NoopSpan(); private static readonly NoopSpan noopSpan = new NoopSpan();
private static readonly NoopEntrySpan noopEntrySpan=new NoopEntrySpan();
private int _stackDepth; private readonly Stack<ISpan> _spans = new Stack<ISpan>();
public void Inject(IContextCarrier carrier) public void Inject(IContextCarrier carrier)
{ {
...@@ -39,7 +40,14 @@ namespace SkyWalking.Context ...@@ -39,7 +40,14 @@ namespace SkyWalking.Context
public IContextSnapshot Capture { get; } public IContextSnapshot Capture { get; }
public ISpan ActiveSpan { get; } public ISpan ActiveSpan
{
get
{
_spans.TryPeek(out var span);
return span;
}
}
public void Continued(IContextSnapshot snapshot) public void Continued(IContextSnapshot snapshot)
{ {
...@@ -52,26 +60,28 @@ namespace SkyWalking.Context ...@@ -52,26 +60,28 @@ namespace SkyWalking.Context
public ISpan CreateEntrySpan(string operationName) public ISpan CreateEntrySpan(string operationName)
{ {
_stackDepth++; _spans.Push(noopEntrySpan);
return noopSpan; return noopEntrySpan;
} }
public ISpan CreateLocalSpan(string operationName) public ISpan CreateLocalSpan(string operationName)
{ {
_stackDepth++; _spans.Push(noopSpan);
return noopSpan; return noopSpan;
} }
public ISpan CreateExitSpan(string operationName, string remotePeer) public ISpan CreateExitSpan(string operationName, string remotePeer)
{ {
_stackDepth++; var exitSpan = new NoopExitSpan(remotePeer);
return noopSpan; _spans.Push(exitSpan);
return exitSpan;
} }
public void StopSpan(ISpan span) public void StopSpan(ISpan span)
{ {
_stackDepth--; _spans.TryPop(out _);
if (_stackDepth == 0) { if (_spans.Count == 0)
{
ListenerManager.NotifyFinish(this); ListenerManager.NotifyFinish(this);
} }
} }
......
namespace SkyWalking.Context.Trace
{
public class NoopEntrySpan:NoopSpan
{
public override bool IsEntry { get; } = true;
}
}
\ No newline at end of file
...@@ -22,9 +22,9 @@ namespace SkyWalking.Context.Trace ...@@ -22,9 +22,9 @@ namespace SkyWalking.Context.Trace
{ {
public class NoopExitSpan : NoopSpan, IWithPeerInfo public class NoopExitSpan : NoopSpan, IWithPeerInfo
{ {
public int PeerId => throw new NotImplementedException(); public int PeerId => peerId;
public string Peer => throw new NotImplementedException(); public string Peer => peer;
private String peer; private String peer;
private int peerId; private int peerId;
...@@ -38,5 +38,7 @@ namespace SkyWalking.Context.Trace ...@@ -38,5 +38,7 @@ namespace SkyWalking.Context.Trace
{ {
this.peer = peer; this.peer = peer;
} }
public override bool IsExit { get; } = true;
} }
} }
...@@ -63,6 +63,7 @@ namespace SkyWalking.Remote ...@@ -63,6 +63,7 @@ namespace SkyWalking.Remote
new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection
.GrpcChannel); .GrpcChannel);
var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application); var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application);
await Task.Delay(TimeSpan.FromSeconds(1), token);
var applicationId = applicationMapping?.Application?.Value; var applicationId = applicationMapping?.Application?.Value;
if (!applicationId.HasValue || DictionaryUtil.IsNull(applicationId.Value)) if (!applicationId.HasValue || DictionaryUtil.IsNull(applicationId.Value))
{ {
......
...@@ -35,7 +35,7 @@ namespace SkyWalking.Remote ...@@ -35,7 +35,7 @@ namespace SkyWalking.Remote
protected override async Task Starting(CancellationToken token) protected override async Task Starting(CancellationToken token)
{ {
await Task.Delay(TimeSpan.FromSeconds(15)); await Task.Delay(TimeSpan.FromSeconds(15), token);
} }
protected override async Task Execute(CancellationToken token) protected override async Task Execute(CancellationToken token)
......
...@@ -72,7 +72,7 @@ namespace SkyWalking.Remote ...@@ -72,7 +72,7 @@ namespace SkyWalking.Remote
} }
_logger.Debug( _logger.Debug(
$"Transform and send UpstreamSegment to collector. TraceSegmentId : {traceSegment.TraceSegmentId}"); $"Transform and send UpstreamSegment to collector. [TraceSegmentId] = {traceSegment.TraceSegmentId} [GlobalTraceId] = {traceSegment.RelatedGlobalTraces.FirstOrDefault()}");
} }
catch (Exception e) catch (Exception e)
{ {
......
...@@ -48,7 +48,7 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -48,7 +48,7 @@ namespace SkyWalking.Diagnostics.CAP
} }
[DiagnosticName(CapEvents.CapBeforePublish)] [DiagnosticName(CapEvents.CapBeforePublish)]
public void CapBeforePublish(BrokerPublishEventData eventData) public void CapBeforePublish([Object]BrokerPublishEventData eventData)
{ {
var operationName = BrokerOperationNameResolver(eventData); var operationName = BrokerOperationNameResolver(eventData);
var contextCarrier = new ContextCarrier(); var contextCarrier = new ContextCarrier();
...@@ -56,7 +56,7 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -56,7 +56,7 @@ namespace SkyWalking.Diagnostics.CAP
var span = ContextManager.CreateExitSpan(operationName, contextCarrier, peer); var span = ContextManager.CreateExitSpan(operationName, contextCarrier, peer);
span.SetComponent(ComponentsDefine.CAP); span.SetComponent(ComponentsDefine.CAP);
span.SetLayer(SpanLayer.MQ); span.SetLayer(SpanLayer.MQ);
span.Tag(Tags.MqTopic.Key, eventData.BrokerTopicName); Tags.MqTopic.Set(span, eventData.BrokerTopicName);
foreach (var item in contextCarrier.Items) foreach (var item in contextCarrier.Items)
{ {
eventData.Headers.Add(item.HeadKey, item.HeadValue); eventData.Headers.Add(item.HeadKey, item.HeadValue);
...@@ -64,13 +64,13 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -64,13 +64,13 @@ namespace SkyWalking.Diagnostics.CAP
} }
[DiagnosticName(CapEvents.CapAfterPublish)] [DiagnosticName(CapEvents.CapAfterPublish)]
public void CapAfterPublish(BrokerPublishEndEventData eventData) public void CapAfterPublish([Object]BrokerPublishEndEventData eventData)
{ {
ContextManager.StopSpan(); ContextManager.StopSpan();
} }
[DiagnosticName(CapEvents.CapErrorPublish)] [DiagnosticName(CapEvents.CapErrorPublish)]
public void CapErrorPublish(BrokerPublishErrorEventData eventData) public void CapErrorPublish([Object]BrokerPublishErrorEventData eventData)
{ {
var capSpan = ContextManager.ActiveSpan; var capSpan = ContextManager.ActiveSpan;
if (capSpan == null) if (capSpan == null)
...@@ -83,7 +83,7 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -83,7 +83,7 @@ namespace SkyWalking.Diagnostics.CAP
} }
[DiagnosticName(CapEvents.CapBeforeConsume)] [DiagnosticName(CapEvents.CapBeforeConsume)]
public void CapBeforeConsume(BrokerConsumeEventData eventData) public void CapBeforeConsume([Object]BrokerConsumeEventData eventData)
{ {
var operationName = BrokerOperationNameResolver(eventData); var operationName = BrokerOperationNameResolver(eventData);
var carrier = new ContextCarrier(); var carrier = new ContextCarrier();
...@@ -108,11 +108,11 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -108,11 +108,11 @@ namespace SkyWalking.Diagnostics.CAP
var span = ContextManager.CreateEntrySpan(operationName, carrier); var span = ContextManager.CreateEntrySpan(operationName, carrier);
span.SetComponent(ComponentsDefine.CAP); span.SetComponent(ComponentsDefine.CAP);
span.SetLayer(SpanLayer.MQ); span.SetLayer(SpanLayer.MQ);
span.Tag(Tags.MqTopic.Key, eventData.BrokerTopicName); Tags.MqTopic.Set(span, eventData.BrokerTopicName);
} }
[DiagnosticName(CapEvents.CapAfterConsume)] [DiagnosticName(CapEvents.CapAfterConsume)]
public void CapAfterConsume(BrokerConsumeEndEventData eventData) public void CapAfterConsume([Object]BrokerConsumeEndEventData eventData)
{ {
var capSpan = ContextManager.ActiveSpan; var capSpan = ContextManager.ActiveSpan;
if (capSpan == null) if (capSpan == null)
...@@ -124,7 +124,7 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -124,7 +124,7 @@ namespace SkyWalking.Diagnostics.CAP
} }
[DiagnosticName(CapEvents.CapErrorConsume)] [DiagnosticName(CapEvents.CapErrorConsume)]
public void CapErrorConsume(BrokerConsumeErrorEventData eventData) public void CapErrorConsume([Object]BrokerConsumeErrorEventData eventData)
{ {
var capSpan = ContextManager.ActiveSpan; var capSpan = ContextManager.ActiveSpan;
if (capSpan == null) if (capSpan == null)
...@@ -138,7 +138,7 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -138,7 +138,7 @@ namespace SkyWalking.Diagnostics.CAP
} }
[DiagnosticName(CapEvents.CapBeforeSubscriberInvoke)] [DiagnosticName(CapEvents.CapBeforeSubscriberInvoke)]
public void CapBeforeSubscriberInvoke(SubscriberInvokeEventData eventData) public void CapBeforeSubscriberInvoke([Object]SubscriberInvokeEventData eventData)
{ {
var span = ContextManager.CreateLocalSpan("Subscriber invoke"); var span = ContextManager.CreateLocalSpan("Subscriber invoke");
span.SetComponent(ComponentsDefine.CAP); span.SetComponent(ComponentsDefine.CAP);
...@@ -146,13 +146,13 @@ namespace SkyWalking.Diagnostics.CAP ...@@ -146,13 +146,13 @@ namespace SkyWalking.Diagnostics.CAP
} }
[DiagnosticName(CapEvents.CapAfterSubscriberInvoke)] [DiagnosticName(CapEvents.CapAfterSubscriberInvoke)]
public void CapAfterSubscriberInvoke(SubscriberInvokeEventData eventData) public void CapAfterSubscriberInvoke([Object]SubscriberInvokeEventData eventData)
{ {
ContextManager.StopSpan(); ContextManager.StopSpan();
} }
[DiagnosticName(CapEvents.CapErrorSubscriberInvoke)] [DiagnosticName(CapEvents.CapErrorSubscriberInvoke)]
public void CapErrorSubscriberInvoke(SubscriberInvokeErrorEventData eventData) public void CapErrorSubscriberInvoke([Object]SubscriberInvokeErrorEventData eventData)
{ {
var capSpan = ContextManager.ActiveSpan; var capSpan = ContextManager.ActiveSpan;
if (capSpan == null) if (capSpan == null)
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
* *
*/ */
using System;
using System.Net.Http; using System.Net.Http;
using SkyWalking.Context; using SkyWalking.Context;
using SkyWalking.Context.Tag; using SkyWalking.Context.Tag;
...@@ -29,7 +30,7 @@ namespace SkyWalking.Diagnostics.HttpClient ...@@ -29,7 +30,7 @@ namespace SkyWalking.Diagnostics.HttpClient
public string ListenerName { get; } = "HttpHandlerDiagnosticListener"; public string ListenerName { get; } = "HttpHandlerDiagnosticListener";
[DiagnosticName("System.Net.Http.Request")] [DiagnosticName("System.Net.Http.Request")]
public void HttpRequest(HttpRequestMessage request) public void HttpRequest([Property(Name = "Request")] HttpRequestMessage request)
{ {
var contextCarrier = new ContextCarrier(); var contextCarrier = new ContextCarrier();
var peer = $"{request.RequestUri.Host}:{request.RequestUri.Port}"; var peer = $"{request.RequestUri.Host}:{request.RequestUri.Port}";
...@@ -43,14 +44,26 @@ namespace SkyWalking.Diagnostics.HttpClient ...@@ -43,14 +44,26 @@ namespace SkyWalking.Diagnostics.HttpClient
} }
[DiagnosticName("System.Net.Http.Response")] [DiagnosticName("System.Net.Http.Response")]
public void HttpResponse(HttpResponseMessage response) public void HttpResponse([Property(Name = "Response")] HttpResponseMessage response)
{ {
var span = ContextManager.ActiveSpan; var span = ContextManager.ActiveSpan;
if (span != null && span.IsExit) if (span != null && response != null)
{ {
Tags.StatusCode.Set(span, response.StatusCode.ToString()); Tags.StatusCode.Set(span, response.StatusCode.ToString());
}
ContextManager.StopSpan(span); ContextManager.StopSpan(span);
} }
[DiagnosticName("System.Net.Http.Exception")]
public void HttpException([Property(Name = "Request")] HttpRequestMessage request,
[Property(Name = "Exception")] Exception ex)
{
var span = ContextManager.ActiveSpan;
if (span != null && span.IsExit)
{
span.ErrorOccurred();
}
} }
} }
} }
\ No newline at end of file
using System;
using SkyWalking.Context;
namespace SkyWalking.Diagnostics.HttpClient.Tests
{
public class FakeIgnoreTracerContextListener : IIgnoreTracerContextListener ,IDisposable
{
public int Counter { get; set; }
public FakeIgnoreTracerContextListener()
{
IgnoredTracerContext.ListenerManager.Add(this);
}
public void AfterFinish(ITracerContext tracerContext)
{
Counter = Counter + 1;
}
public void Dispose()
{
IgnoredTracerContext.ListenerManager.Remove(this);
}
}
}
\ No newline at end of file
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using SkyWalking.Config;
using Xunit;
namespace SkyWalking.Diagnostics.HttpClient.Tests
{
public class HttpClientDiagnosticTests
{
[Fact]
public async Task HttpClient_Request_Success_Test()
{
//Todo fix ci
/*AgentConfig.ApplicationCode = "HttpClientDiagnosticTests";
CollectorConfig.DirectServers = "HttpClientDiagnosticTests.xx:50000";
var httpClientDiagnosticProcessor = new HttpClientDiagnosticProcessor();
var observer = new TracingDiagnosticProcessorObserver(new ITracingDiagnosticProcessor[]
{httpClientDiagnosticProcessor});
DiagnosticListener.AllListeners.Subscribe(observer);
using (var tracerContextListener = new FakeIgnoreTracerContextListener())
{
var httpClient = new System.Net.Http.HttpClient();
await httpClient.GetAsync("https://github.com");
Assert.Equal(1, tracerContextListener.Counter);
}*/
}
[Fact]
public async Task HttpClient_Request_Fail_Test()
{
AgentConfig.ApplicationCode = "HttpClientDiagnosticTests";
CollectorConfig.DirectServers = "HttpClientDiagnosticTests.xx:50000";
var httpClientDiagnosticProcessor = new HttpClientDiagnosticProcessor();
var observer = new TracingDiagnosticProcessorObserver(new ITracingDiagnosticProcessor[]
{httpClientDiagnosticProcessor});
DiagnosticListener.AllListeners.Subscribe(observer);
using (var tracerContextListener = new FakeIgnoreTracerContextListener())
{
try
{
var httpClient = new System.Net.Http.HttpClient();
await httpClient.GetAsync("http://HttpClientDiagnosticTests.xx");
}
catch (Exception e)
{
}
Assert.Equal(1, tracerContextListener.Counter);
}
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\SkyWalking.Diagnostics.HttpClient\SkyWalking.Diagnostics.HttpClient.csproj" />
</ItemGroup>
</Project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment