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,
"LogLevel": { "Debug": {
"Default": "Debug", "LogLevel": {
"System": "Information", "Default": "Debug"
"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);
......
...@@ -39,7 +39,7 @@ namespace SkyWalking.AspNetCore ...@@ -39,7 +39,7 @@ namespace SkyWalking.AspNetCore
public SkyWalkingHostedService(IOptions<SkyWalkingOptions> options, IHostingEnvironment hostingEnvironment, public SkyWalkingHostedService(IOptions<SkyWalkingOptions> options, IHostingEnvironment hostingEnvironment,
TracingDiagnosticProcessorObserver diagnosticObserver, ILoggerFactory loggerFactory) TracingDiagnosticProcessorObserver diagnosticObserver, ILoggerFactory loggerFactory)
{ {
if (string.IsNullOrEmpty(options.Value.DirectServers)) if (string.IsNullOrEmpty(options.Value.DirectServers))
{ {
throw new ArgumentException("DirectServers cannot be empty or null."); throw new ArgumentException("DirectServers cannot be empty or null.");
...@@ -63,8 +63,8 @@ namespace SkyWalking.AspNetCore ...@@ -63,8 +63,8 @@ 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.");
} }
catch (Exception e) catch (Exception e)
...@@ -86,7 +86,7 @@ namespace SkyWalking.AspNetCore ...@@ -86,7 +86,7 @@ namespace SkyWalking.AspNetCore
{ {
_logger.Error("SkyWalking Agent stop fail.", e); _logger.Error("SkyWalking Agent stop fail.", e);
} }
} }
} }
} }
\ No newline at end of file
...@@ -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,96 +45,120 @@ namespace SkyWalking.Remote ...@@ -45,96 +45,120 @@ 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
{ {
if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationId)) 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);
var retry = 0;
var applicationId = 0;
while (retry++ < 3 && DictionaryUtil.IsNull(applicationId))
{ {
var application = new Application {ApplicationCode = AgentConfig.ApplicationCode};
var applicationRegisterService =
new ApplicationRegisterService.ApplicationRegisterServiceClient(availableConnection
.GrpcChannel);
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))
{ {
_logger.Warning( break;
"Register application fail. Server response null.");
return;
} }
await Task.Delay(500, token);
_logger.Info(
$"Register application success. [applicationCode] = {application.ApplicationCode}. [applicationId] = {applicationId.Value}");
RemoteDownstreamConfig.Agent.ApplicationId = applicationId.Value;
} }
if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId)) if (DictionaryUtil.IsNull(applicationId))
{ {
var instanceDiscoveryService = _logger.Warning(
new InstanceDiscoveryService.InstanceDiscoveryServiceClient(availableConnection.GrpcChannel); "Register application fail. Server response null.");
return;
var agentUUID = Guid.NewGuid().ToString("N"); }
var registerTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var hostName = Dns.GetHostName(); _logger.Info(
$"Register application success. [applicationCode] = {application.ApplicationCode}. [applicationId] = {applicationId}");
RemoteDownstreamConfig.Agent.ApplicationId = applicationId;
}
}
var osInfo = new OSInfo private async Task RegisterApplicationInstance(GrpcConnection availableConnection, CancellationToken token)
{ {
Hostname = hostName, if (DictionaryUtil.IsNull(RemoteDownstreamConfig.Agent.ApplicationInstanceId))
OsName = Environment.OSVersion.ToString(), {
ProcessNo = Process.GetCurrentProcess().Id var instanceDiscoveryService =
}; new InstanceDiscoveryService.InstanceDiscoveryServiceClient(availableConnection.GrpcChannel);
// todo fix Device not configured var agentUUID = Guid.NewGuid().ToString("N");
//var ipv4s = Dns.GetHostAddresses(hostName); var registerTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
//foreach (var ipAddress in ipv4s.Where(x => x.AddressFamily == AddressFamily.InterNetwork))
// osInfo.Ipv4S.Add(ipAddress.ToString());
var applicationInstance = new ApplicationInstance var hostName = Dns.GetHostName();
{
ApplicationId = RemoteDownstreamConfig.Agent.ApplicationId,
AgentUUID = agentUUID,
RegisterTime = registerTime,
Osinfo = osInfo
};
var applicationInstanceId = 0; var osInfo = new OSInfo
var retry = 0; {
Hostname = hostName,
OsName = Environment.OSVersion.ToString(),
ProcessNo = Process.GetCurrentProcess().Id
};
while (retry++ <= 3 && DictionaryUtil.IsNull(applicationInstanceId)) // todo fix Device not configured
{ //var ipv4s = Dns.GetHostAddresses(hostName);
var applicationInstanceMapping = //foreach (var ipAddress in ipv4s.Where(x => x.AddressFamily == AddressFamily.InterNetwork))
await instanceDiscoveryService.registerInstanceAsync(applicationInstance); // osInfo.Ipv4S.Add(ipAddress.ToString());
await Task.Delay(TimeSpan.FromSeconds(1), token);
applicationInstanceId = applicationInstanceMapping.ApplicationInstanceId;
}
var applicationInstance = new ApplicationInstance
{
ApplicationId = RemoteDownstreamConfig.Agent.ApplicationId,
AgentUUID = agentUUID,
RegisterTime = registerTime,
Osinfo = osInfo
};
var retry = 0;
var applicationInstanceId = 0;
while (retry++ < 5 && DictionaryUtil.IsNull(applicationInstanceId))
{
var applicationInstanceMapping =await instanceDiscoveryService.registerInstanceAsync(applicationInstance);
applicationInstanceId = applicationInstanceMapping.ApplicationInstanceId;
if (!DictionaryUtil.IsNull(applicationInstanceId)) if (!DictionaryUtil.IsNull(applicationInstanceId))
{ {
RemoteDownstreamConfig.Agent.ApplicationInstanceId = applicationInstanceId; break;
_logger.Info(
$"Register application instance success. [applicationInstanceId] = {applicationInstanceId}");
}
else
{
_logger.Warning(
"Register application instance fail. Server response null.");
} }
await Task.Delay(500, token);
}
if (!DictionaryUtil.IsNull(applicationInstanceId))
{
RemoteDownstreamConfig.Agent.ApplicationInstanceId = applicationInstanceId;
_logger.Info(
$"Register application instance success. [applicationInstanceId] = {applicationInstanceId}");
}
else
{
_logger.Warning(
"Register application instance fail. Server response null.");
} }
}
catch (Exception exception)
{
_logger.Warning($"Try register application fail. {exception.Message}");
availableConnection?.Failure();
} }
} }
} }
......
...@@ -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