Skip to content

Commit

Permalink
Added static registration for http tracers. (#967) (#994)
Browse files Browse the repository at this point in the history
Added a static registration mechanism (following the pattern of filters mentioned in the comments on #967) for http tracers. This will likely be expanded to a more general registration mechanism in future work. This PR is part of the work towards solving #967.

This commit deprecates the existing HttpFilterConfigFactory filter API in favor of NamedHttpFilterConfigFactory.
  • Loading branch information
mrice32 authored and htuch committed May 24, 2017
1 parent 115434a commit 3a466c3
Show file tree
Hide file tree
Showing 43 changed files with 971 additions and 294 deletions.
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) {
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

0 comments on commit 3a466c3

Please sign in to comment.