Unverified Commit 035c6b2a authored by Lemon's avatar Lemon Committed by GitHub

Fix: Register application/applicationInstance service return null (#45)

* Fix: register application fial

* Fix registerInstance return null

* Fix: register applicationInstance fail

* Optimize performance for call application registerApplication service

* Modify the timeout parameter
parent 8317b958
{ {
"Logging": { "Logging": {
"IncludeScopes": false, "IncludeScopes": false,
"Debug": {
"LogLevel": { "LogLevel": {
"Default": "Debug", "Default": "Debug"
"System": "Information", }
"Microsoft": "Information" },
"Console": {
"LogLevel": {
"Default": "Debug"
}
} }
} }
} }
...@@ -13,3 +13,4 @@ ...@@ -13,3 +13,4 @@
} }
} }
} }
...@@ -39,7 +39,7 @@ namespace SkyWalking.AspNetCore.Diagnostics ...@@ -39,7 +39,7 @@ namespace SkyWalking.AspNetCore.Diagnostics
var carrier = new ContextCarrier(); var carrier = new ContextCarrier();
foreach (var item in carrier.Items) foreach (var item in carrier.Items)
item.HeadValue = httpContext.Request.Headers[item.HeadKey]; item.HeadValue = httpContext.Request.Headers[item.HeadKey];
var httpRequestSpan = ContextManager.CreateEntrySpan(httpContext.Request.Path, carrier); var httpRequestSpan = ContextManager.CreateEntrySpan($"{Config.AgentConfig.ApplicationCode} {httpContext.Request.Path}", carrier);
httpRequestSpan.AsHttp(); httpRequestSpan.AsHttp();
httpRequestSpan.SetComponent(ComponentsDefine.AspNetCore); httpRequestSpan.SetComponent(ComponentsDefine.AspNetCore);
Tags.Url.Set(httpRequestSpan, httpContext.Request.Path); Tags.Url.Set(httpRequestSpan, httpContext.Request.Path);
......
...@@ -63,7 +63,7 @@ namespace SkyWalking.AspNetCore ...@@ -63,7 +63,7 @@ namespace SkyWalking.AspNetCore
try try
{ {
DiagnosticListener.AllListeners.Subscribe(_diagnosticObserver); DiagnosticListener.AllListeners.Subscribe(_diagnosticObserver);
await GrpcConnectionManager.Instance.ConnectAsync(); await GrpcConnectionManager.Instance.ConnectAsync(TimeSpan.FromSeconds(3));
await ServiceManager.Instance.Initialize(); await ServiceManager.Instance.Initialize();
_logger.Info("SkyWalking Agent started."); _logger.Info("SkyWalking Agent started.");
} }
......
...@@ -80,7 +80,6 @@ namespace SkyWalking.Context.Trace ...@@ -80,7 +80,6 @@ namespace SkyWalking.Context.Trace
} }
} }
public void RelatedGlobalTrace(DistributedTraceId distributedTraceId) public void RelatedGlobalTrace(DistributedTraceId distributedTraceId)
{ {
_relatedGlobalTraces.Append(distributedTraceId); _relatedGlobalTraces.Append(distributedTraceId);
......
...@@ -45,27 +45,52 @@ namespace SkyWalking.Remote ...@@ -45,27 +45,52 @@ namespace SkyWalking.Remote
return; return;
} }
if (!GrpcConnectionManager.Instance.Available)
{
return;
}
var availableConnection = GrpcConnectionManager.Instance.GetAvailableConnection(); var availableConnection = GrpcConnectionManager.Instance.GetAvailableConnection();
if (availableConnection == null) if (availableConnection == null)
{ {
_logger.Warning(
$"Register application fail. {GrpcConnectionManager.NotFoundErrorMessage}");
return; return;
} }
try try
{
await RegisterApplication(availableConnection, token);
await RegisterApplicationInstance(availableConnection, token);
}
catch (Exception exception)
{
_logger.Warning($"Register application fail. {exception.Message}");
availableConnection.Failure();
}
}
private async Task RegisterApplication(GrpcConnection availableConnection, CancellationToken token)
{ {
if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationId)) if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationId))
{ {
var application = new Application {ApplicationCode = AgentConfig.ApplicationCode}; var application = new Application {ApplicationCode = AgentConfig.ApplicationCode};
var applicationRegisterService = var applicationRegisterService =
new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection.GrpcChannel);
.GrpcChannel);
var retry = 0;
var applicationId = 0;
while (retry++ < 3 && DictionaryUtil.IsNull(applicationId))
{
var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application); var applicationMapping = await applicationRegisterService.applicationCodeRegisterAsync(application);
await Task.Delay(TimeSpan.FromSeconds(1), token); applicationId = applicationMapping?.Application?.Value ?? 0;
var applicationId = applicationMapping?.Application?.Value; if (!DictionaryUtil.IsNull(applicationId))
if (!applicationId.HasValue || DictionaryUtil.IsNull(applicationId.Value)) {
break;
}
await Task.Delay(500, token);
}
if (DictionaryUtil.IsNull(applicationId))
{ {
_logger.Warning( _logger.Warning(
"Register application fail. Server response null."); "Register application fail. Server response null.");
...@@ -73,10 +98,13 @@ namespace SkyWalking.Remote ...@@ -73,10 +98,13 @@ namespace SkyWalking.Remote
} }
_logger.Info( _logger.Info(
$"Register application success. [applicationCode] = {application.ApplicationCode}. [applicationId] = {applicationId.Value}"); $"Register application success. [applicationCode] = {application.ApplicationCode}. [applicationId] = {applicationId}");
RemoteDownstreamConfig.Agent.ApplicationId = applicationId.Value; RemoteDownstreamConfig.Agent.ApplicationId = applicationId;
}
} }
private async Task RegisterApplicationInstance(GrpcConnection availableConnection, CancellationToken token)
{
if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId)) if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId))
{ {
var instanceDiscoveryService = var instanceDiscoveryService =
...@@ -107,15 +135,17 @@ namespace SkyWalking.Remote ...@@ -107,15 +135,17 @@ namespace SkyWalking.Remote
Osinfo = osInfo Osinfo = osInfo
}; };
var applicationInstanceId = 0;
var retry = 0; var retry = 0;
var applicationInstanceId = 0;
while (retry++ <= 3 && DictionaryUtil.IsNull(applicationInstanceId)) while (retry++ < 5 && DictionaryUtil.IsNull(applicationInstanceId))
{ {
var applicationInstanceMapping = var applicationInstanceMapping =await instanceDiscoveryService.registerInstanceAsync(applicationInstance);
await instanceDiscoveryService.registerInstanceAsync(applicationInstance);
await Task.Delay(TimeSpan.FromSeconds(1), token);
applicationInstanceId = applicationInstanceMapping.ApplicationInstanceId; applicationInstanceId = applicationInstanceMapping.ApplicationInstanceId;
if (!DictionaryUtil.IsNull(applicationInstanceId))
{
break;
}
await Task.Delay(500, token);
} }
if (!DictionaryUtil.IsNull(applicationInstanceId)) if (!DictionaryUtil.IsNull(applicationInstanceId))
...@@ -131,11 +161,5 @@ namespace SkyWalking.Remote ...@@ -131,11 +161,5 @@ namespace SkyWalking.Remote
} }
} }
} }
catch (Exception exception)
{
_logger.Warning($"Try register application fail. {exception.Message}");
availableConnection?.Failure();
}
}
} }
} }
\ No newline at end of file
...@@ -43,7 +43,7 @@ namespace SkyWalking.Remote ...@@ -43,7 +43,7 @@ namespace SkyWalking.Remote
_internalChannel = new Channel(server, ChannelCredentials.Insecure); _internalChannel = new Channel(server, ChannelCredentials.Insecure);
} }
public async Task<bool> ConnectAsync() public async Task<bool> ConnectAsync(TimeSpan timeout)
{ {
if (_state == GrpcConnectionState.Ready) if (_state == GrpcConnectionState.Ready)
{ {
...@@ -52,8 +52,7 @@ namespace SkyWalking.Remote ...@@ -52,8 +52,7 @@ namespace SkyWalking.Remote
_state = GrpcConnectionState.Connecting; _state = GrpcConnectionState.Connecting;
try try
{ {
// default timeout = 5s var deadLine = DateTime.UtcNow.AddSeconds(timeout.TotalSeconds);
var deadLine = DateTime.UtcNow.AddSeconds(5);
await _internalChannel.ConnectAsync(deadLine); await _internalChannel.ConnectAsync(deadLine);
_state = GrpcConnectionState.Ready; _state = GrpcConnectionState.Ready;
_logger.Info($"Grpc channel connect success. [Server] = {_internalChannel.Target}"); _logger.Info($"Grpc channel connect success. [Server] = {_internalChannel.Target}");
...@@ -80,7 +79,7 @@ namespace SkyWalking.Remote ...@@ -80,7 +79,7 @@ namespace SkyWalking.Remote
} }
catch (Exception e) catch (Exception e)
{ {
_logger.Warning($"Grpc channel shutdown fail. {e.Message}"); _logger.Debug($"Grpc channel shutdown fail. {e.Message}");
} }
finally finally
{ {
......
...@@ -28,20 +28,22 @@ namespace SkyWalking.Remote ...@@ -28,20 +28,22 @@ namespace SkyWalking.Remote
public class GrpcConnectionManager public class GrpcConnectionManager
{ {
private static readonly ILogger _logger = LogManager.GetLogger<GrpcConnectionManager>(); private static readonly ILogger _logger = LogManager.GetLogger<GrpcConnectionManager>();
private static readonly GrpcConnectionManager _client = new GrpcConnectionManager();
public const string NotFoundErrorMessage = "Not found available connection."; public const string NotFoundErrorMessage = "Not found available connection.";
public static GrpcConnectionManager Instance => _client; public static GrpcConnectionManager Instance { get; } = new GrpcConnectionManager();
private readonly Random _random = new Random(); private readonly Random _random = new Random();
private readonly AsyncLock _lock = new AsyncLock(); private readonly AsyncLock _lock = new AsyncLock();
private GrpcConnection _connection; private GrpcConnection _connection;
public bool Available => _connection != null && _connection.CheckState();
private GrpcConnectionManager() private GrpcConnectionManager()
{ {
} }
public async Task ConnectAsync() public async Task ConnectAsync(TimeSpan timeout)
{ {
// using async lock // using async lock
using (await _lock.LockAsync()) using (await _lock.LockAsync())
...@@ -51,8 +53,13 @@ namespace SkyWalking.Remote ...@@ -51,8 +53,13 @@ namespace SkyWalking.Remote
return; return;
} }
if (_connection != null && !_connection.CheckState())
{
await _connection.ShutdowmAsync();
}
_connection = new GrpcConnection(GetServer(_connection?.Server)); _connection = new GrpcConnection(GetServer(_connection?.Server));
await _connection.ConnectAsync(); await _connection.ConnectAsync(timeout);
} }
} }
......
...@@ -25,14 +25,14 @@ namespace SkyWalking.Remote ...@@ -25,14 +25,14 @@ namespace SkyWalking.Remote
{ {
public class GrpcConnectionService : TimerService public class GrpcConnectionService : TimerService
{ {
protected override TimeSpan Interval { get; } = TimeSpan.FromMinutes(1); protected override TimeSpan Interval { get; } = TimeSpan.FromSeconds(15);
protected override async Task Execute(CancellationToken token) protected override async Task Execute(CancellationToken token)
{ {
var connection = GrpcConnectionManager.Instance.GetAvailableConnection(); if (!GrpcConnectionManager.Instance.Available)
if (connection == null || !connection.CheckState())
{ {
await GrpcConnectionManager.Instance.ConnectAsync(); // default timeout = 5s
await GrpcConnectionManager.Instance.ConnectAsync(TimeSpan.FromSeconds(5));
} }
} }
} }
......
...@@ -35,14 +35,14 @@ namespace SkyWalking.Remote ...@@ -35,14 +35,14 @@ namespace SkyWalking.Remote
protected override async Task Starting(CancellationToken token) protected override async Task Starting(CancellationToken token)
{ {
await Task.Delay(TimeSpan.FromSeconds(15), token); await Task.Delay(TimeSpan.FromMinutes(1), token);
} }
protected override async Task Execute(CancellationToken token) protected override async Task Execute(CancellationToken token)
{ {
if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId)) if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId))
{ {
_logger.Warning($"{DateTime.Now} Heartbeat fail. Application instance is not registered."); _logger.Debug($"{DateTime.Now} Heartbeat fail. Application instance is not registered.");
return; return;
} }
...@@ -50,7 +50,7 @@ namespace SkyWalking.Remote ...@@ -50,7 +50,7 @@ namespace SkyWalking.Remote
if (availableConnection == null) if (availableConnection == null)
{ {
_logger.Warning($"{DateTime.Now} Heartbeat fail. {GrpcConnectionManager.NotFoundErrorMessage}"); _logger.Debug($"{DateTime.Now} Heartbeat fail. {GrpcConnectionManager.NotFoundErrorMessage}");
return; return;
} }
...@@ -71,8 +71,8 @@ namespace SkyWalking.Remote ...@@ -71,8 +71,8 @@ namespace SkyWalking.Remote
} }
catch (Exception e) catch (Exception e)
{ {
_logger.Warning($"{DateTime.Now} Heartbeat fail. {e.Message}"); _logger.Debug($"{DateTime.Now} Heartbeat fail. {e.Message}");
availableConnection?.Failure(); availableConnection.Failure();
} }
} }
} }
......
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