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