Skip to content

Commit df4b545

Browse files
authored
Merge pull request #19 from lambdaliu/server_report
feat: add polaris service call result report plguin
2 parents 260b49e + 1a7ff96 commit df4b545

File tree

13 files changed

+170
-142
lines changed

13 files changed

+170
-142
lines changed

include/polaris/plugin.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ enum PluginType {
4343
kPluginCircuitBreaker, ///< 节点熔断扩展点
4444
kPluginWeightAdjuster, ///< 动态权重调整扩展点
4545
kPluginStatReporter, ///< 统计上报扩展点
46-
kPluginAlertReporter ///< 告警扩展点
46+
kPluginAlertReporter, ///< 告警扩展点
47+
kPluginServerMetric, ///< SDK与Server请求结果统计
48+
49+
kPluginTypeMaxCount // 插件类型数量
4750
};
4851

4952
/// @brief 路由插件事件回调
@@ -501,6 +504,25 @@ class AlertReporter : public Plugin {
501504
virtual ReturnCode ReportAlert(AlertLevel alert_level, std::string msg) = 0;
502505
};
503506

507+
///@brief 扩展点接口:收集北极星SDK调用服务器结果
508+
class ServerMetric : public Plugin {
509+
public:
510+
virtual ~ServerMetric() {}
511+
512+
/// @brief 通过配置进行初始化
513+
virtual ReturnCode Init(Config* config, Context* context) = 0;
514+
515+
/// @brief 内部服务调用结果上报
516+
///
517+
/// @param service_key 服务
518+
/// @param instance 实例
519+
/// @param ret_code 返回码
520+
/// @param ret_status 是否成功
521+
/// @param daley 延迟
522+
virtual void MetricReport(const ServiceKey& service_key, const Instance& instance,
523+
ReturnCode ret_code, CallRetStatus ret_status, uint64_t daley) = 0;
524+
};
525+
504526
} // namespace polaris
505527

506528
#endif // POLARIS_CPP_INCLUDE_POLARIS_PLUGIN_H_

polaris/api/consumer_api.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,4 +901,25 @@ ReturnCode ConsumerApiImpl::GetSystemServer(Context* context, const ServiceKey&
901901
return ret;
902902
}
903903

904+
void ConsumerApiImpl::UpdateServerResult(Context* context, const ServiceKey& service_key,
905+
const Instance& instance, PolarisServerCode code,
906+
CallRetStatus status, uint64_t delay) {
907+
InstanceGauge instance_gauge;
908+
instance_gauge.service_namespace = service_key.namespace_;
909+
instance_gauge.service_name = service_key.name_;
910+
instance_gauge.instance_id = instance.GetId();
911+
instance_gauge.call_daley = delay;
912+
instance_gauge.call_ret_code = code;
913+
instance_gauge.call_ret_status = status;
914+
ReturnCode ret_code = kReturnOk;
915+
if (kServerCodeConnectError <= code && code <= kServerCodeInvalidResponse) {
916+
ret_code = (code == kServerCodeRpcTimeout) ? kReturnTimeout : kReturnServerError;
917+
}
918+
ConsumerApiImpl::UpdateServiceCallResult(context, instance_gauge);
919+
ServerMetric* metric = context->GetContextImpl()->GetServerMetric();
920+
if (metric != NULL) {
921+
metric->MetricReport(service_key, instance, ret_code, status, delay);
922+
}
923+
}
924+
904925
} // namespace polaris

polaris/api/consumer_api.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <stdint.h>
1818
#include <string>
1919

20+
#include "model/return_code.h"
2021
#include "polaris/defs.h"
2122
#include "polaris/model.h"
2223
#include "polaris/plugin.h"
@@ -94,6 +95,10 @@ class ConsumerApiImpl {
9495
const Criteria& criteria, Instance*& instance, uint64_t timeout,
9596
const std::string& protocol = "grpc");
9697

98+
static void UpdateServerResult(Context* context, const ServiceKey& service_key,
99+
const Instance& instance, PolarisServerCode code,
100+
CallRetStatus status, uint64_t delay);
101+
97102
private:
98103
static void GetBackupInstances(ServiceInstances* service_instances, LoadBalancer* load_balancer,
99104
GetOneInstanceRequestAccessor& request,

polaris/context.cpp

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,8 @@ ReturnCode ContextImpl::InitApiConfig(Config* api_config) {
572572

573573
ReturnCode ContextImpl::InitGlobalConfig(Config* config, Context* context) {
574574
// Init server connector plugin
575-
Config* plugin_config = config->GetSubConfig("serverConnector");
576-
Plugin* plugin = NULL;
575+
ScopedPtr<Config> plugin_config(config->GetSubConfig("serverConnector"));
576+
Plugin* plugin = NULL;
577577
std::string protocol =
578578
plugin_config->GetStringOrDefault("protocol", kPluginDefaultServerConnector);
579579
PluginManager::Instance().GetPlugin(protocol, kPluginServerConnector, plugin);
@@ -582,11 +582,9 @@ ReturnCode ContextImpl::InitGlobalConfig(Config* config, Context* context) {
582582
POLARIS_LOG(LOG_ERROR,
583583
"Plugin factory register with name[%s] and type[%s] return error instance",
584584
protocol.c_str(), PluginTypeToString(kPluginServerConnector));
585-
delete plugin_config;
586585
return kReturnPluginError;
587586
}
588-
ReturnCode ret = server_connector_->Init(plugin_config, context);
589-
delete plugin_config;
587+
ReturnCode ret = server_connector_->Init(plugin_config.Get(), context);
590588
if (ret != kReturnOk) {
591589
return ret;
592590
}
@@ -607,7 +605,7 @@ ReturnCode ContextImpl::InitGlobalConfig(Config* config, Context* context) {
607605
}
608606

609607
// Init stat reporter
610-
plugin_config = config->GetSubConfig("statReporter");
608+
plugin_config.Reset(config->GetSubConfig("statReporter"));
611609
plugin = NULL;
612610
std::string plugin_name = plugin_config->GetStringOrDefault("name", kPluginDefaultStatReporter);
613611
PluginManager::Instance().GetPlugin(plugin_name, kPluginStatReporter, plugin);
@@ -616,30 +614,45 @@ ReturnCode ContextImpl::InitGlobalConfig(Config* config, Context* context) {
616614
POLARIS_LOG(LOG_ERROR,
617615
"Plugin factory register with name[%s] and type[%s] return error instance",
618616
plugin_name.c_str(), PluginTypeToString(kPluginStatReporter));
619-
delete plugin_config;
620617
return kReturnPluginError;
621618
}
622-
ret = stat_reporter_->Init(plugin_config, context);
623-
delete plugin_config;
619+
ret = stat_reporter_->Init(plugin_config.Get(), context);
624620
if (ret != kReturnOk) {
625621
return ret;
626622
}
627623

628624
// Init alert reporter
629-
plugin_config = config->GetSubConfig("alertReporter");
630-
plugin = NULL;
631-
plugin_name = plugin_config->GetStringOrDefault("name", kPluginDefaultAlertReporter);
625+
plugin_config.Reset(config->GetSubConfig("alertReporter"));
626+
plugin = NULL;
627+
plugin_name = plugin_config->GetStringOrDefault("name", kPluginDefaultAlertReporter);
632628
PluginManager::Instance().GetPlugin(plugin_name, kPluginAlertReporter, plugin);
633629
alert_reporter_ = dynamic_cast<AlertReporter*>(plugin);
634630
if (alert_reporter_ == NULL) {
635631
POLARIS_LOG(LOG_ERROR,
636632
"Plugin factory register with name[%s] and type[%s] return error instance",
637633
plugin_name.c_str(), PluginTypeToString(kPluginAlertReporter));
638-
delete plugin_config;
639634
return kReturnPluginError;
640635
}
641-
ret = alert_reporter_->Init(plugin_config, context);
642-
delete plugin_config;
636+
ret = alert_reporter_->Init(plugin_config.Get(), context);
637+
if (ret != kReturnOk) {
638+
return ret;
639+
}
640+
641+
// Init server metric
642+
plugin_config.Reset(config->GetSubConfig("serverMetric"));
643+
plugin = NULL;
644+
plugin_name = plugin_config->GetStringOrDefault("name", "");
645+
if (!plugin_name.empty()) {
646+
PluginManager::Instance().GetPlugin(plugin_name, kPluginServerMetric, plugin);
647+
server_metric_.Set(dynamic_cast<ServerMetric*>(plugin));
648+
if (server_metric_.IsNull()) {
649+
POLARIS_LOG(LOG_ERROR,
650+
"Plugin factory register with name[%s] and type[%s] return error instance",
651+
plugin_name.c_str(), PluginTypeToString(kPluginServerMetric));
652+
return kReturnPluginError;
653+
}
654+
ret = server_metric_->Init(plugin_config.Get(), context);
655+
}
643656
return ret;
644657
}
645658

polaris/context_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ class ContextImpl {
110110

111111
AlertReporter* GetAlertReporter() { return alert_reporter_; }
112112

113+
ServerMetric* GetServerMetric() { return server_metric_.Get(); }
114+
113115
ServiceContext* GetOrCreateServiceContext(const ServiceKey& service_key);
114116

115117
void DeleteServiceContext(const ServiceKey& service_key);
@@ -219,6 +221,7 @@ class ContextImpl {
219221
LocalRegistry* local_registry_;
220222
StatReporter* stat_reporter_;
221223
AlertReporter* alert_reporter_;
224+
ScopedPtr<ServerMetric> server_metric_;
222225
QuotaManager* quota_manager_; // 配额管理器
223226

224227
// Service config and Service level context

polaris/metric/metric_connector.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -474,19 +474,12 @@ ReturnCode MetricConnector::SelectConnection(const v1::MetricKey& metric_key,
474474

475475
void MetricConnector::UpdateCallResult(Instance* instance, PolarisServerCode server_code) {
476476
POLARIS_ASSERT(instance != NULL);
477-
const PolarisCluster& cluster = context_->GetContextImpl()->GetMetricService();
478-
InstanceGauge instance_gauge;
479-
instance_gauge.service_namespace = cluster.service_.namespace_;
480-
instance_gauge.service_name = cluster.service_.name_;
481-
instance_gauge.instance_id = instance->GetId();
482-
instance_gauge.call_daley = 100;
483-
instance_gauge.call_ret_code = server_code;
477+
const ServiceKey& service = context_->GetContextImpl()->GetMetricService().service_;
478+
CallRetStatus status = kCallRetOk;
484479
if (kServerCodeConnectError <= server_code && server_code <= kServerCodeInvalidResponse) {
485-
instance_gauge.call_ret_status = kCallRetError;
486-
} else {
487-
instance_gauge.call_ret_status = kCallRetOk;
480+
status = kCallRetError;
488481
}
489-
ConsumerApiImpl::UpdateServiceCallResult(context_, instance_gauge);
482+
ConsumerApiImpl::UpdateServerResult(context_, service, *instance, server_code, status, 100);
490483
}
491484

492485
} // namespace polaris

polaris/monitor/api_stat_registry.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ static const char* g_ApiStatKeyMap[] = {"Consumer::InitService",
5050
"Provider::AsyncHeartbeat"};
5151

5252
// 静态断言两处stat key的长度相等
53-
STATIC_ASSERT(sizeof(g_ApiStatKeyMap) / sizeof(const char*) == kApiStatKeyCount, "");
53+
STATIC_ASSERT(sizeof(g_ApiStatKeyMap) / sizeof(const char*) == kApiStatKeyCount,
54+
"api stat key define error");
5455

5556
static const char* g_DelayRangeStr[] = {
5657
"[0ms,2ms)", "[2ms, 10ms)", "[10ms,50ms)", "[50ms,100ms)",

polaris/monitor/monitor_reporter.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -869,23 +869,17 @@ bool MonitorReporter::GetInstance(ReportBase* report_data) {
869869

870870
void MonitorReporter::UpdateCallResult(ReportBase* report_data) {
871871
POLARIS_ASSERT(report_data->instance_ != NULL);
872-
InstanceGauge instance_gauge;
873-
const PolarisCluster& monitor_cluster = context_->GetContextImpl()->GetMonitorService();
874-
instance_gauge.service_namespace = monitor_cluster.service_.namespace_;
875-
instance_gauge.service_name = monitor_cluster.service_.name_;
876-
instance_gauge.instance_id = report_data->instance_->GetId();
877-
delete report_data->instance_;
878-
report_data->instance_ = NULL;
879-
instance_gauge.call_daley = Time::GetCurrentTimeMs() - report_data->call_begin_;
880-
instance_gauge.call_ret_code = report_data->server_code_;
872+
const ServiceKey& service = context_->GetContextImpl()->GetMonitorService().service_;
873+
CallRetStatus status = kCallRetOk;
881874
if (kServerCodeConnectError <= report_data->server_code_ &&
882875
report_data->server_code_ <= kServerCodeInvalidResponse) {
883-
instance_gauge.call_ret_status = kCallRetError;
884-
} else {
885-
instance_gauge.call_ret_status = kCallRetOk;
876+
status = kCallRetError;
886877
}
887-
ConsumerApiImpl::UpdateServiceCallResult(context_, instance_gauge);
888-
878+
uint64_t delay = Time::GetCurrentTimeMs() - report_data->call_begin_;
879+
ConsumerApiImpl::UpdateServerResult(context_, service, *report_data->instance_,
880+
report_data->server_code_, status, delay);
881+
delete report_data->instance_;
882+
report_data->instance_ = NULL;
889883
POLARIS_ASSERT(report_data->grpc_client_ != NULL);
890884
// 由于本方法在grpc stream的callback中调用,为了防止stream释放自身,需要异步释放grpc client
891885
report_data->grpc_client_->CloseStream();

polaris/plugin/plugin_manager.cpp

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,36 +45,28 @@
4545
#include "polaris/model.h"
4646
#include "polaris/plugin.h"
4747
#include "utils/indestructible.h"
48+
#include "utils/static_assert.h"
4849

4950
namespace polaris {
5051

52+
#define TO_STR(value) #value
53+
54+
static const char* g_PluginTypeString[] = {
55+
TO_STR(kPluginServerConnector), TO_STR(kPluginLocalRegistry), TO_STR(kPluginServiceRouter),
56+
TO_STR(kPluginLoadBalancer), TO_STR(kPluginHealthChecker), TO_STR(kPluginCircuitBreaker),
57+
TO_STR(kPluginWeightAdjuster), TO_STR(kPluginStatReporter), TO_STR(kPluginAlertReporter),
58+
TO_STR(kPluginServerMetric)};
59+
60+
STATIC_ASSERT(sizeof(g_PluginTypeString) / sizeof(const char*) == kPluginTypeMaxCount,
61+
"plugin type define error");
62+
5163
ReturnCode RegisterPlugin(std::string name, PluginType plugin_type, PluginFactory plugin_factory) {
5264
return PluginManager::Instance().RegisterPlugin(name, plugin_type, plugin_factory);
5365
}
5466

5567
const char* PluginTypeToString(PluginType plugin_type) {
56-
switch (plugin_type) {
57-
case kPluginServerConnector:
58-
return "ServerConnector";
59-
case kPluginLocalRegistry:
60-
return "LocalRegistry";
61-
case kPluginServiceRouter:
62-
return "ServiceRouter";
63-
case kPluginLoadBalancer:
64-
return "LoadBalancer";
65-
case kPluginHealthChecker:
66-
return "HealthChecker";
67-
case kPluginCircuitBreaker:
68-
return "CircuitBreaker";
69-
case kPluginWeightAdjuster:
70-
return "WeightAdjuster";
71-
case kPluginStatReporter:
72-
return "StatReporter";
73-
case kPluginAlertReporter:
74-
return "AlertReporter";
75-
default:
76-
return "UnknowPluginType";
77-
}
68+
POLARIS_ASSERT(plugin_type < kPluginTypeMaxCount);
69+
return g_PluginTypeString[plugin_type];
7870
}
7971

8072
PluginManager& PluginManager::Instance() {

0 commit comments

Comments
 (0)