using Grpc.Extension.Abstract;
using Grpc.Extension.Common.Internal;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OpenTracing;
using OpenTracing.Util;
using System;
namespace Grpc.Extension.Client
{
///
/// GrpcClient启动类
///
public class GrpcClientApp
{
private readonly GrpcClientOptions _grpcClientOptions;
private readonly ILoggerFactory _loggerFactory;
///
/// GrpcClientApp
///
///
///
///
public GrpcClientApp(IServiceProvider serviceProvider, IOptions grpcClientOptions, ILoggerFactory loggerFactory)
{
ServiceProviderAccessor.SetServiceProvider(serviceProvider);
_grpcClientOptions = grpcClientOptions.Value;
_loggerFactory = loggerFactory;
this.UseLoggerFactory()//使用LoggerFactory
.UseJaeger();
}
///
/// 注入Grpc,Discovery配制
///
///
///
public GrpcClientApp UseGrpcOptions(Action options)
{
options(_grpcClientOptions);
return this;
}
///
/// 使用LoggerFactory
///
///
private GrpcClientApp UseLoggerFactory()
{
var _logger = _loggerFactory.CreateLogger();
var _loggerAccess = _loggerFactory.CreateLogger("grpc.access");
LoggerAccessor.Instance.LoggerError += (ex, type) => _logger.LogError(ex.ToString());
LoggerAccessor.Instance.LoggerMonitor += (msg, type) => _loggerAccess.LogInformation(msg);
return this;
}
///
/// 配制日志(默认使用LoggerFactory)
///
///
///
public GrpcClientApp UseLogger(Action action)
{
action(LoggerAccessor.Instance);
return this;
}
///
/// 有Jaeger配制就使用Jaeger
///
private void UseJaeger()
{
var jaeger = _grpcClientOptions.Jaeger;
if (jaeger?.CheckConfig() == true)
{
var tracer = ServiceProviderAccessor.GetService();
if (tracer != null) GlobalTracer.Register(tracer);
}
}
///
/// 启动
///
public void Run()
{
//检查服务发现配制
if (string.IsNullOrWhiteSpace(_grpcClientOptions.DiscoveryUrl))
throw new ArgumentException("GrpcClient:DiscoveryUrl is null");
}
}
}