Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added static registration for http tracers. (#967) #994

Merged
merged 8 commits into from
May 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions source/exe/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ envoy_cc_library(
"//source/server/config/http:dynamo_lib",
"//source/server/config/http:fault_lib",
"//source/server/config/http:grpc_http1_bridge_lib",
"//source/server/config/http:lightstep_lib",
"//source/server/config/http:ratelimit_lib",
"//source/server/config/http:router_lib",
"//source/server/config/http:zipkin_lib",
"//source/server/config/network:client_ssl_auth_lib",
"//source/server/config/network:echo_lib",
"//source/server/config/network:http_connection_manager_lib",
Expand Down
22 changes: 22 additions & 0 deletions source/server/config/http/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,17 @@ envoy_cc_library(
],
)

envoy_cc_library(
name = "lightstep_lib",
srcs = ["lightstep_http_tracer.cc"],
hdrs = ["lightstep_http_tracer.h"],
deps = [
"//include/envoy/server:instance_interface",
"//source/common/tracing:http_tracer_lib",
"//source/server:configuration_lib",
],
)

envoy_cc_library(
name = "ratelimit_lib",
srcs = ["ratelimit.cc"],
Expand All @@ -77,3 +88,14 @@ envoy_cc_library(
"//source/server/config/network:http_connection_manager_lib",
],
)

envoy_cc_library(
name = "zipkin_lib",
srcs = ["zipkin_http_tracer.cc"],
hdrs = ["zipkin_http_tracer.h"],
deps = [
"//include/envoy/server:instance_interface",
"//source/common/tracing/zipkin:zipkin_lib",
"//source/server:configuration_lib",
],
)
20 changes: 11 additions & 9 deletions source/server/config/http/buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ namespace Envoy {
namespace Server {
namespace Configuration {

HttpFilterFactoryCb BufferFilterConfig::tryCreateFilterFactory(HttpFilterType type,
const std::string& name,
const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) {
if (type != HttpFilterType::Decoder || name != "buffer") {
return nullptr;
HttpFilterFactoryCb BufferFilterConfig::createFilterFactory(HttpFilterType type,
const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) {
if (type != HttpFilterType::Decoder) {
throw EnvoyException(
fmt::format("{} http filter must be configured as a decoder filter.", name()));
}

json_config.validateSchema(Json::Schema::BUFFER_HTTP_FILTER_SCHEMA);
Expand All @@ -32,10 +32,12 @@ HttpFilterFactoryCb BufferFilterConfig::tryCreateFilterFactory(HttpFilterType ty
};
}

std::string BufferFilterConfig::name() { return "buffer"; }

/**
* Static registration for the buffer filter. @see RegisterHttpFilterConfigFactory.
* Static registration for the buffer filter. @see RegisterNamedHttpFilterConfigFactory.
*/
static RegisterHttpFilterConfigFactory<BufferFilterConfig> register_;
static RegisterNamedHttpFilterConfigFactory<BufferFilterConfig> register_;

} // Configuration
} // Server
Expand Down
12 changes: 6 additions & 6 deletions source/server/config/http/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ namespace Server {
namespace Configuration {

/**
* Config registration for the buffer filter. @see HttpFilterConfigFactory.
* Config registration for the buffer filter. @see NamedHttpFilterConfigFactory.
*/
class BufferFilterConfig : public HttpFilterConfigFactory {
class BufferFilterConfig : public NamedHttpFilterConfigFactory {
public:
HttpFilterFactoryCb tryCreateFilterFactory(HttpFilterType type, const std::string& name,
const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) override;
HttpFilterFactoryCb createFilterFactory(HttpFilterType type, const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) override;
std::string name() override;
};

} // Configuration
Expand Down
20 changes: 11 additions & 9 deletions source/server/config/http/dynamo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ namespace Envoy {
namespace Server {
namespace Configuration {

HttpFilterFactoryCb DynamoFilterConfig::tryCreateFilterFactory(HttpFilterType type,
const std::string& name,
const Json::Object&,
const std::string& stat_prefix,
Server::Instance& server) {
if (type != HttpFilterType::Both || name != "http_dynamo_filter") {
return nullptr;
HttpFilterFactoryCb DynamoFilterConfig::createFilterFactory(HttpFilterType type,
const Json::Object&,
const std::string& stat_prefix,
Server::Instance& server) {
if (type != HttpFilterType::Both) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated to the review, a question that came up recently while discussing filters with @alyssawilk. Why is Envoy filter config structured such that (1) filters know their HttpFilterType yet (2) the type is specified in the config as well, meaning we need to check consistency. It seems this could be elided from the config. The only thing I can think of is that some filters might work as encoder/decoder depending upon configuration... @RomanDzhabarov @ccaraman @junr03 for insight here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@htuch cannot think about anything else, but fwiw, currently, no HTTP filters support this behavior.

throw EnvoyException(fmt::format(
"{} http filter must be configured as both a decoder and encoder filter.", name()));
}

return [&server, stat_prefix](Http::FilterChainFactoryCallbacks& callbacks) -> void {
Expand All @@ -23,10 +23,12 @@ HttpFilterFactoryCb DynamoFilterConfig::tryCreateFilterFactory(HttpFilterType ty
};
}

std::string DynamoFilterConfig::name() { return "http_dynamo_filter"; }

/**
* Static registration for the http dynamodb filter. @see RegisterHttpFilterConfigFactory.
* Static registration for the http dynamodb filter. @see RegisterNamedHttpFilterConfigFactory.
*/
static RegisterHttpFilterConfigFactory<DynamoFilterConfig> register_;
static RegisterNamedHttpFilterConfigFactory<DynamoFilterConfig> register_;

} // Configuration
} // Server
Expand Down
9 changes: 5 additions & 4 deletions source/server/config/http/dynamo.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ namespace Configuration {
/**
* Config registration for http dynamodb filter.
*/
class DynamoFilterConfig : public HttpFilterConfigFactory {
class DynamoFilterConfig : public NamedHttpFilterConfigFactory {
public:
HttpFilterFactoryCb tryCreateFilterFactory(HttpFilterType type, const std::string& name,
const Json::Object&, const std::string& stat_prefix,
Server::Instance& server) override;
HttpFilterFactoryCb createFilterFactory(HttpFilterType type, const Json::Object&,
const std::string& stat_prefix,
Server::Instance& server) override;
std::string name() override;
};

} // Configuration
Expand Down
20 changes: 11 additions & 9 deletions source/server/config/http/fault.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ namespace Envoy {
namespace Server {
namespace Configuration {

HttpFilterFactoryCb FaultFilterConfig::tryCreateFilterFactory(HttpFilterType type,
const std::string& name,
const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) {
if (type != HttpFilterType::Decoder || name != "fault") {
return nullptr;
HttpFilterFactoryCb FaultFilterConfig::createFilterFactory(HttpFilterType type,
const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) {
if (type != HttpFilterType::Decoder) {
throw EnvoyException(
fmt::format("{} http filter must be configured as a decoder filter.", name()));
}

Http::FaultFilterConfigSharedPtr config(
Expand All @@ -26,10 +26,12 @@ HttpFilterFactoryCb FaultFilterConfig::tryCreateFilterFactory(HttpFilterType typ
};
}

std::string FaultFilterConfig::name() { return "fault"; }

/**
* Static registration for the fault filter. @see RegisterHttpFilterConfigFactory.
* Static registration for the fault filter. @see RegisterNamedHttpFilterConfigFactory.
*/
static RegisterHttpFilterConfigFactory<FaultFilterConfig> register_;
static RegisterNamedHttpFilterConfigFactory<FaultFilterConfig> register_;

} // Configuration
} // Server
Expand Down
12 changes: 6 additions & 6 deletions source/server/config/http/fault.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ namespace Server {
namespace Configuration {

/**
* Config registration for the fault injection filter. @see HttpFilterConfigFactory.
* Config registration for the fault injection filter. @see NamedHttpFilterConfigFactory.
*/
class FaultFilterConfig : public HttpFilterConfigFactory {
class FaultFilterConfig : public NamedHttpFilterConfigFactory {
public:
HttpFilterFactoryCb tryCreateFilterFactory(HttpFilterType type, const std::string& name,
const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) override;
HttpFilterFactoryCb createFilterFactory(HttpFilterType type, const Json::Object& json_config,
const std::string& stats_prefix,
Server::Instance& server) override;
std::string name() override;
};

} // Configuration
Expand Down
20 changes: 11 additions & 9 deletions source/server/config/http/grpc_http1_bridge.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ namespace Envoy {
namespace Server {
namespace Configuration {

HttpFilterFactoryCb GrpcHttp1BridgeFilterConfig::tryCreateFilterFactory(HttpFilterType type,
const std::string& name,
const Json::Object&,
const std::string&,
Server::Instance& server) {
if (type != HttpFilterType::Both || name != "grpc_http1_bridge") {
return nullptr;
HttpFilterFactoryCb GrpcHttp1BridgeFilterConfig::createFilterFactory(HttpFilterType type,
const Json::Object&,
const std::string&,
Server::Instance& server) {
if (type != HttpFilterType::Both) {
throw EnvoyException(fmt::format(
"{} http filter must be configured as both a decoder and encoder filter.", name()));
}

return [&server](Http::FilterChainFactoryCallbacks& callbacks) -> void {
Expand All @@ -23,10 +23,12 @@ HttpFilterFactoryCb GrpcHttp1BridgeFilterConfig::tryCreateFilterFactory(HttpFilt
};
}

std::string GrpcHttp1BridgeFilterConfig::name() { return "grpc_http1_bridge"; }

/**
* Static registration for the grpc HTTP1 bridge filter. @see RegisterHttpFilterConfigFactory.
* Static registration for the grpc HTTP1 bridge filter. @see RegisterNamedHttpFilterConfigFactory.
*/
static RegisterHttpFilterConfigFactory<GrpcHttp1BridgeFilterConfig> register_;
static RegisterNamedHttpFilterConfigFactory<GrpcHttp1BridgeFilterConfig> register_;

} // Configuration
} // Server
Expand Down
10 changes: 5 additions & 5 deletions source/server/config/http/grpc_http1_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ namespace Server {
namespace Configuration {

/**
* Config registration for the grpc HTTP1 bridge filter. @see HttpFilterConfigFactory.
* Config registration for the grpc HTTP1 bridge filter. @see NamedHttpFilterConfigFactory.
*/
class GrpcHttp1BridgeFilterConfig : public HttpFilterConfigFactory {
class GrpcHttp1BridgeFilterConfig : public NamedHttpFilterConfigFactory {
public:
HttpFilterFactoryCb tryCreateFilterFactory(HttpFilterType type, const std::string& name,
const Json::Object&, const std::string&,
Server::Instance& server) override;
HttpFilterFactoryCb createFilterFactory(HttpFilterType type, const Json::Object&,
const std::string&, Server::Instance& server) override;
std::string name() override;
};

} // Configuration
Expand Down
46 changes: 46 additions & 0 deletions source/server/config/http/lightstep_http_tracer.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include "server/config/http/lightstep_http_tracer.h"

#include <string>

#include "common/common/utility.h"
#include "common/tracing/http_tracer_impl.h"
#include "common/tracing/lightstep_tracer_impl.h"

#include "lightstep/options.h"
#include "lightstep/tracer.h"

namespace Envoy {
namespace Server {
namespace Configuration {

Tracing::HttpTracerPtr
LightstepHttpTracerFactory::createHttpTracer(const Json::Object& json_config,
Server::Instance& server,
Upstream::ClusterManager& cluster_manager) {

Envoy::Runtime::RandomGenerator& rand = server.random();

std::unique_ptr<lightstep::TracerOptions> opts(new lightstep::TracerOptions());
opts->access_token = server.api().fileReadToEnd(json_config.getString("access_token_file"));
StringUtil::rtrim(opts->access_token);

opts->tracer_attributes["lightstep.component_name"] = server.localInfo().clusterName();
opts->guid_generator = [&rand]() { return rand.random(); };

Tracing::DriverPtr lightstep_driver(
new Tracing::LightStepDriver(json_config, cluster_manager, server.stats(),
server.threadLocal(), server.runtime(), std::move(opts)));
return Tracing::HttpTracerPtr(
new Tracing::HttpTracerImpl(std::move(lightstep_driver), server.localInfo()));
}

std::string LightstepHttpTracerFactory::name() { return "lightstep"; }

/**
* Static registration for the lightstep http tracer. @see RegisterHttpTracerFactory.
*/
static RegisterHttpTracerFactory<LightstepHttpTracerFactory> register_;

} // Configuration
} // Server
} // Envoy
27 changes: 27 additions & 0 deletions source/server/config/http/lightstep_http_tracer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once

#include <string>

#include "envoy/server/instance.h"

#include "server/configuration_impl.h"

namespace Envoy {
namespace Server {
namespace Configuration {

/**
* Config registration for the lightstep tracer. @see HttpTracerFactory.
*/
class LightstepHttpTracerFactory : public HttpTracerFactory {
public:
// HttpTracerFactory
Tracing::HttpTracerPtr createHttpTracer(const Json::Object& json_config, Server::Instance& server,
Upstream::ClusterManager& cluster_manager) override;

std::string name() override;
};

} // Configuration
} // Server
} // Envoy
20 changes: 11 additions & 9 deletions source/server/config/http/ratelimit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ namespace Envoy {
namespace Server {
namespace Configuration {

HttpFilterFactoryCb RateLimitFilterConfig::tryCreateFilterFactory(HttpFilterType type,
const std::string& name,
const Json::Object& config,
const std::string&,
Server::Instance& server) {
if (type != HttpFilterType::Decoder || name != "rate_limit") {
return nullptr;
HttpFilterFactoryCb RateLimitFilterConfig::createFilterFactory(HttpFilterType type,
const Json::Object& config,
const std::string&,
Server::Instance& server) {
if (type != HttpFilterType::Decoder) {
throw EnvoyException(
fmt::format("{} http filter must be configured as a decoder filter.", name()));
}

Http::RateLimit::FilterConfigSharedPtr filter_config(new Http::RateLimit::FilterConfig(
Expand All @@ -26,10 +26,12 @@ HttpFilterFactoryCb RateLimitFilterConfig::tryCreateFilterFactory(HttpFilterType
};
}

std::string RateLimitFilterConfig::name() { return "rate_limit"; }

/**
* Static registration for the rate limit filter. @see RegisterHttpFilterConfigFactory.
* Static registration for the rate limit filter. @see RegisterNamedHttpFilterConfigFactory.
*/
static RegisterHttpFilterConfigFactory<RateLimitFilterConfig> register_;
static RegisterNamedHttpFilterConfigFactory<RateLimitFilterConfig> register_;

} // Configuration
} // Server
Expand Down
10 changes: 5 additions & 5 deletions source/server/config/http/ratelimit.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ namespace Server {
namespace Configuration {

/**
* Config registration for the rate limit filter. @see HttpFilterConfigFactory.
* Config registration for the rate limit filter. @see NamedHttpFilterConfigFactory.
*/
class RateLimitFilterConfig : public HttpFilterConfigFactory {
class RateLimitFilterConfig : public NamedHttpFilterConfigFactory {
public:
HttpFilterFactoryCb tryCreateFilterFactory(HttpFilterType type, const std::string& name,
const Json::Object& config, const std::string&,
Server::Instance& server) override;
HttpFilterFactoryCb createFilterFactory(HttpFilterType type, const Json::Object& config,
const std::string&, Server::Instance& server) override;
std::string name() override;
};

} // Configuration
Expand Down
Loading