From 6d7f0eebec4d00856987f9e8f55e4b9b4ddd8455 Mon Sep 17 00:00:00 2001 From: Wayne Zhang Date: Thu, 26 Jan 2017 23:38:51 -0800 Subject: [PATCH] Add originIp and originHost attributes. (#56) --- .../endpoints/include/api_manager/request.h | 2 + .../api_manager/context/request_context.cc | 3 +- .../endpoints/src/api_manager/mixer/mixer.cc | 107 ++++++++++++------ .../endpoints/src/api_manager/mixer/mixer.h | 10 ++ .../src/api_manager/service_control/info.h | 8 +- src/envoy/prototype/api_manager_filter.cc | 1 + 6 files changed, 95 insertions(+), 36 deletions(-) diff --git a/contrib/endpoints/include/api_manager/request.h b/contrib/endpoints/include/api_manager/request.h index ad604b5a41bd..8d96ff356d67 100644 --- a/contrib/endpoints/include/api_manager/request.h +++ b/contrib/endpoints/include/api_manager/request.h @@ -43,6 +43,8 @@ class Request { // Gets Client IP // This will be used by service control Check() call. virtual std::string GetClientIP() = 0; + // Gets Client Host. + virtual std::string GetClientHost() { return ""; } // Get GRPC stats. virtual int64_t GetGrpcRequestBytes() = 0; diff --git a/contrib/endpoints/src/api_manager/context/request_context.cc b/contrib/endpoints/src/api_manager/context/request_context.cc index cbf4e925e376..59cc7c3d53f5 100644 --- a/contrib/endpoints/src/api_manager/context/request_context.cc +++ b/contrib/endpoints/src/api_manager/context/request_context.cc @@ -171,6 +171,8 @@ void RequestContext::FillOperationInfo(service_control::OperationInfo *info) { info->producer_project_id = service_context()->project_id(); info->referer = http_referer_; info->request_start_time = start_time_; + info->client_ip = request_->GetClientIP(); + info->client_host = request_->GetClientHost(); } void RequestContext::FillLocation(service_control::ReportRequestInfo *info) { @@ -221,7 +223,6 @@ void RequestContext::FillLogMessage(service_control::ReportRequestInfo *info) { void RequestContext::FillCheckRequestInfo( service_control::CheckRequestInfo *info) { FillOperationInfo(info); - info->client_ip = request_->GetClientIP(); info->allow_unregistered_calls = method()->allow_unregistered_calls(); } diff --git a/contrib/endpoints/src/api_manager/mixer/mixer.cc b/contrib/endpoints/src/api_manager/mixer/mixer.cc index 47f6c4a8a2f0..e9ea9a30ea57 100644 --- a/contrib/endpoints/src/api_manager/mixer/mixer.cc +++ b/contrib/endpoints/src/api_manager/mixer/mixer.cc @@ -22,8 +22,11 @@ namespace api_manager { namespace mixer { namespace { +const std::string kProxyPeerID = "Istio/Proxy"; + const std::string kAttrNameServiceName = "serviceName"; const std::string kAttrNamePeerId = "peerId"; +const std::string kAttrNameOperationId = "operationId"; const std::string kAttrNameOperationName = "operationName"; const std::string kAttrNameApiKey = "apiKey"; const std::string kAttrNameResponseCode = "responseCode"; @@ -35,6 +38,9 @@ const std::string kAttrNameApiMethod = "apiMethod"; const std::string kAttrNameRequestSize = "requestSize"; const std::string kAttrNameResponseSize = "responseSize"; const std::string kAttrNameLogMessage = "logMessage"; +const std::string kAttrNameResponseTime = "responseTime"; +const std::string kAttrNameOriginIp = "originIp"; +const std::string kAttrNameOriginHost = "originHost"; Attributes::Value StringValue(const std::string& str) { Attributes::Value v; @@ -50,37 +56,6 @@ Attributes::Value Int64Value(int64_t value) { return v; } -void FillCheckAttributes(const service_control::CheckRequestInfo& info, - const std::string& service_name, - ::istio::mixer_client::Attributes* attr) { - attr->attributes[kAttrNameServiceName] = StringValue(service_name); - attr->attributes[kAttrNamePeerId] = StringValue("Proxy"); - attr->attributes[kAttrNameOperationName] = StringValue(info.operation_name); - attr->attributes[kAttrNameApiKey] = StringValue(info.api_key); -} - -void FillReportAttributes(const service_control::ReportRequestInfo& info, - const std::string& service_name, - ::istio::mixer_client::Attributes* attr) { - attr->attributes[kAttrNameServiceName] = StringValue(service_name); - attr->attributes[kAttrNamePeerId] = StringValue("Proxy"); - attr->attributes[kAttrNameOperationName] = StringValue(info.operation_name); - attr->attributes[kAttrNameApiKey] = StringValue(info.api_key); - - attr->attributes[kAttrNameURL] = StringValue(info.url); - attr->attributes[kAttrNameLocation] = StringValue(info.location); - - attr->attributes[kAttrNameApiName] = StringValue(info.api_name); - attr->attributes[kAttrNameApiVersion] = StringValue(info.api_version); - attr->attributes[kAttrNameApiMethod] = StringValue(info.api_method); - - attr->attributes[kAttrNameLogMessage] = StringValue(info.log_message); - - attr->attributes[kAttrNameResponseCode] = Int64Value(info.response_code); - attr->attributes[kAttrNameRequestSize] = Int64Value(info.request_size); - attr->attributes[kAttrNameResponseSize] = Int64Value(info.response_size); -} - } // namespace Mixer::Mixer(ApiManagerEnvInterface* env, const Config* config) @@ -98,9 +73,75 @@ Status Mixer::Init() { Status Mixer::Close() { return Status::OK; } +void Mixer::FillCommonAttributes(const service_control::OperationInfo& info, + ::istio::mixer_client::Attributes* attr) { + attr->attributes[kAttrNameServiceName] = StringValue(config_->service_name()); + attr->attributes[kAttrNamePeerId] = StringValue(kProxyPeerID); + + if (!info.operation_id.empty()) { + attr->attributes[kAttrNameOperationId] = StringValue(info.operation_id); + } + if (!info.operation_name.empty()) { + attr->attributes[kAttrNameOperationName] = StringValue(info.operation_name); + } + if (!info.api_key.empty()) { + attr->attributes[kAttrNameApiKey] = StringValue(info.api_key); + } + if (!info.client_ip.empty()) { + attr->attributes[kAttrNameOriginIp] = StringValue(info.client_ip); + } + if (!info.client_host.empty()) { + attr->attributes[kAttrNameOriginHost] = StringValue(info.client_host); + } +} + +void Mixer::FillCheckAttributes(const service_control::CheckRequestInfo& info, + ::istio::mixer_client::Attributes* attr) { + FillCommonAttributes(info, attr); +} + +void Mixer::FillReportAttributes(const service_control::ReportRequestInfo& info, + ::istio::mixer_client::Attributes* attr) { + FillCommonAttributes(info, attr); + + if (!info.url.empty()) { + attr->attributes[kAttrNameURL] = StringValue(info.url); + } + if (!info.location.empty()) { + attr->attributes[kAttrNameLocation] = StringValue(info.location); + } + + if (!info.api_name.empty()) { + attr->attributes[kAttrNameApiName] = StringValue(info.api_name); + } + if (!info.api_version.empty()) { + attr->attributes[kAttrNameApiVersion] = StringValue(info.api_version); + } + if (!info.api_method.empty()) { + attr->attributes[kAttrNameApiMethod] = StringValue(info.api_method); + } + + if (!info.log_message.empty()) { + attr->attributes[kAttrNameLogMessage] = StringValue(info.log_message); + } + + attr->attributes[kAttrNameResponseCode] = Int64Value(info.response_code); + if (info.request_size >= 0) { + attr->attributes[kAttrNameRequestSize] = Int64Value(info.request_size); + } + if (info.response_size >= 0) { + attr->attributes[kAttrNameResponseSize] = Int64Value(info.response_size); + } + + if (info.latency.request_time_ms >= 0) { + attr->attributes[kAttrNameResponseTime] = + Int64Value(info.latency.request_time_ms); + } +} + Status Mixer::Report(const service_control::ReportRequestInfo& info) { ::istio::mixer_client::Attributes attributes; - FillReportAttributes(info, config_->service_name(), &attributes); + FillReportAttributes(info, &attributes); env_->LogInfo("Send Report: "); mixer_client_->Report( attributes, [this](const ::google::protobuf::util::Status& status) { @@ -120,7 +161,7 @@ void Mixer::Check( std::function on_done) { ::istio::mixer_client::Attributes attributes; - FillCheckAttributes(info, config_->service_name(), &attributes); + FillCheckAttributes(info, &attributes); env_->LogInfo("Send Check: "); mixer_client_->Check( attributes, diff --git a/contrib/endpoints/src/api_manager/mixer/mixer.h b/contrib/endpoints/src/api_manager/mixer/mixer.h index 4cf2d1f54a79..b020d2636f9c 100644 --- a/contrib/endpoints/src/api_manager/mixer/mixer.h +++ b/contrib/endpoints/src/api_manager/mixer/mixer.h @@ -50,6 +50,16 @@ class Mixer : public service_control::Interface { // The constructor. Mixer(ApiManagerEnvInterface* env, const Config* config); + // Fill common attributes for both check and report. + void FillCommonAttributes(const service_control::OperationInfo& info, + ::istio::mixer_client::Attributes* attr); + // Fill attributes for check. + void FillCheckAttributes(const service_control::CheckRequestInfo& info, + ::istio::mixer_client::Attributes* attr); + // Fill attributes for report. + void FillReportAttributes(const service_control::ReportRequestInfo& info, + ::istio::mixer_client::Attributes* attr); + // The Api Manager environment interface. ApiManagerEnvInterface* env_; // The config. diff --git a/contrib/endpoints/src/api_manager/service_control/info.h b/contrib/endpoints/src/api_manager/service_control/info.h index 15364ad58c6a..f203057cc9ee 100644 --- a/contrib/endpoints/src/api_manager/service_control/info.h +++ b/contrib/endpoints/src/api_manager/service_control/info.h @@ -60,13 +60,17 @@ struct OperationInfo { // and Report. std::chrono::system_clock::time_point request_start_time; + // The client IP address. + std::string client_ip; + + // The client host name. + std::string client_host; + OperationInfo() {} }; // Information to fill Check request protobuf. struct CheckRequestInfo : public OperationInfo { - // The client IP address. - std::string client_ip; // Whether the method allow unregistered calls. bool allow_unregistered_calls; diff --git a/src/envoy/prototype/api_manager_filter.cc b/src/envoy/prototype/api_manager_filter.cc index 4ccd9e6d1201..869d8e6c5007 100644 --- a/src/envoy/prototype/api_manager_filter.cc +++ b/src/envoy/prototype/api_manager_filter.cc @@ -81,6 +81,7 @@ class Request : public google::api_manager::Request { return header_map_.Path()->value().c_str(); } virtual std::string GetClientIP() override { return ""; } + virtual std::string GetClientHost() override { return ""; } virtual bool FindQuery(const std::string& name, std::string* query) override { if (!query_parsed_) { auto header = header_map_.Path();