def test_configure_context_supports_complex_specs(self): from baseplate.clients.thrift import ThriftClient from baseplate.thrift import BaseplateService app_config = { "enable_some_fancy_feature": "true", "thrift.foo.endpoint": "localhost:9090", "thrift.bar.endpoint": "localhost:9091", } baseplate = Baseplate() baseplate.configure_context( app_config, { "enable_some_fancy_feature": config.Boolean, "thrift": { "foo": ThriftClient(BaseplateService.Client), "bar": ThriftClient(BaseplateService.Client), }, }, ) context = baseplate.make_context_object() with baseplate.make_server_span(context, "test"): self.assertTrue(context.enable_some_fancy_feature) self.assertIsNotNone(context.thrift.foo) self.assertIsNotNone(context.thrift.bar)
def test_client_makes_client_span(client_cls, method, http_server): baseplate = Baseplate({ "myclient.filter.ip_allowlist": "127.0.0.0/8", "myclient.filter.port_denylist": "0" }) baseplate.configure_context({"myclient": client_cls()}) observer = TestBaseplateObserver() baseplate.register(observer) with baseplate.server_context("test") as context: fn = getattr(context.myclient, method.lower()) response = fn(http_server.url) assert response.status_code == 204 server_span_observer = observer.children[0] assert len(server_span_observer.children) == 1 client_span_observer = server_span_observer.children[0] assert client_span_observer.span.name == "myclient.request" assert client_span_observer.on_start_called assert client_span_observer.on_finish_called assert client_span_observer.on_finish_exc_info is None assert client_span_observer.tags["http.url"] == http_server.url assert client_span_observer.tags["http.method"] == method assert client_span_observer.tags["http.status_code"] == 204
def test_connection_error(client_cls): baseplate = Baseplate({ "myclient.filter.ip_allowlist": "127.0.0.0/8", "myclient.filter.port_denylist": "0" }) baseplate.configure_context({"myclient": client_cls()}) observer = TestBaseplateObserver() baseplate.register(observer) bogus_url = "http://localhost:1/" with pytest.raises(requests.exceptions.ConnectionError): with baseplate.server_context("test") as context: context.myclient.get(bogus_url) server_span_observer = observer.children[0] assert len(server_span_observer.children) == 1 client_span_observer = server_span_observer.children[0] assert client_span_observer.span.name == "myclient.request" assert client_span_observer.on_start_called assert client_span_observer.on_finish_called assert client_span_observer.on_finish_exc_info is not None assert client_span_observer.tags["http.url"] == bogus_url assert client_span_observer.tags["http.method"] == "GET" assert "http.status_code" not in client_span_observer.tags
def test_simple_config(self): baseplate = Baseplate({"db.url": "sqlite://"}) baseplate.configure_context({"db": SQLAlchemySession()}) context = baseplate.make_context_object() with baseplate.make_server_span(context, "test"): context.db.execute("SELECT 1;")
def setUp(self): self.baseplate_observer = TestBaseplateObserver() profiles = { "foo": ExecutionProfile(consistency_level=ConsistencyLevel.QUORUM) } baseplate = Baseplate() baseplate.register(self.baseplate_observer) baseplate.configure_context( { "cassandra.contact_points": cassandra_endpoint.address.host, "cassandra_no_prof.contact_points": cassandra_endpoint.address.host, }, { "cassandra_no_prof": CassandraClient(keyspace="system"), "cassandra": CassandraClient(keyspace="system", execution_profiles=profiles), }, ) self.context = baseplate.make_context_object() self.server_span = baseplate.make_server_span(self.context, "test")
def baseplate_thrift_client(endpoint, client_spec, client_span_observer=None): baseplate = Baseplate( app_config={ "baseplate.service_name": "fancy test client", "example_service.endpoint": str(endpoint), } ) if client_span_observer: class TestServerSpanObserver(ServerSpanObserver): def on_child_span_created(self, span): span.register(client_span_observer) observer = TestServerSpanObserver() class TestBaseplateObserver(BaseplateObserver): def on_server_span_created(self, context, span): span.register(observer) baseplate.register(TestBaseplateObserver()) context = baseplate.make_context_object() trace_info = TraceInfo.from_upstream( trace_id="1234", parent_id="2345", span_id="3456", flags=4567, sampled=True ) baseplate.configure_context({"example_service": ThriftClient(client_spec.Client)}) baseplate.make_server_span(context, "example_service.example", trace_info) context.raw_edge_context = FakeEdgeContextFactory.RAW_BYTES yield context
def setUp(self): self.baseplate_observer = TestBaseplateObserver() baseplate = Baseplate({"redis.url": f"redis://{redis_endpoint}/0"}) baseplate.register(self.baseplate_observer) baseplate.configure_context({"redis": RedisClient()}) self.context = baseplate.make_context_object() self.server_span = baseplate.make_server_span(self.context, "test")
def setUp(self): self.baseplate_observer = TestBaseplateObserver() baseplate = Baseplate({"cassandra.contact_points": cassandra_endpoint.address.host}) baseplate.register(self.baseplate_observer) baseplate.configure_context({"cassandra": CassandraClient(keyspace="system")}) self.context = baseplate.make_context_object() self.server_span = baseplate.make_server_span(self.context, "test")
def setUp(self): self.baseplate_observer = TestBaseplateObserver() baseplate = Baseplate({"memcache.endpoint": str(memcached_endpoint)}) baseplate.register(self.baseplate_observer) baseplate.configure_context({"memcache": MemcacheClient()}) self.context = baseplate.make_context_object() self.server_span = baseplate.make_server_span(self.context, "test")
def make_wsgi_app(app_config): baseplate = Baseplate() baseplate.configure_observers(app_config) baseplate.configure_context(app_config, {"db": SQLAlchemySession()}) configurator = Configurator(settings=app_config) configurator.include(BaseplateConfigurator(baseplate).includeme) configurator.add_route("hello_world", "/", request_method="GET") configurator.scan() return configurator.make_wsgi_app()
def setUp(self): self.baseplate_observer = TestBaseplateObserver() baseplate = Baseplate({ "rediscluster.url": f"redis://{redis_endpoint}/0", "rediscluster.timeout": "1 second", "rediscluster.max_connections": "4", }) baseplate.register(self.baseplate_observer) baseplate.configure_context({"rediscluster": ClusterRedisClient()}) self.context = baseplate.make_context_object() self.server_span = baseplate.make_server_span(self.context, "test")
def test_internal_client_sends_headers(http_server): baseplate = Baseplate() baseplate.configure_context({"internal": InternalRequestsClient()}) with baseplate.server_context("test") as context: setattr(context, "raw_edge_context", b"test payload") response = context.internal.get(http_server.url) assert response.status_code == 204 assert response.text == "" assert http_server.requests[0].method == "GET" assert http_server.requests[0].span.trace_id == context.span.trace_id assert http_server.requests[0].span.parent_id == context.span.id assert http_server.requests[0].span.id != context.span.id assert http_server.requests[0].raw_edge_context == b"test payload"
def test_internal_client_sends_headers(http_server): baseplate = Baseplate() baseplate.configure_context({"internal": InternalRequestsClient()}) with baseplate.server_context("test") as context: setattr(context, "raw_request_context", SERIALIZED_EDGECONTEXT_WITH_NO_AUTH) response = context.internal.get(http_server.url) assert response.status_code == 204 assert response.text == "" assert http_server.requests[0].method == "GET" assert http_server.requests[0].trace.trace_id == context.trace.trace_id assert http_server.requests[0].trace.parent_id == context.trace.id assert http_server.requests[0].trace.id != context.trace.id assert http_server.requests[ 0].raw_request_context == SERIALIZED_EDGECONTEXT_WITH_NO_AUTH
def test_external_client_doesnt_send_headers(http_server): baseplate = Baseplate({ "external.filter.ip_allowlist": "127.0.0.0/8", "external.filter.port_denylist": "0" }) baseplate.configure_context({"external": ExternalRequestsClient()}) with baseplate.server_context("test") as context: setattr(context, "raw_edge_context", b"test payload") response = context.external.get(http_server.url) assert response.status_code == 204 assert response.text == "" assert http_server.requests[0].method == "GET" assert "X-Trace" not in http_server.requests[0].headers assert "X-Parent" not in http_server.requests[0].headers assert "X-Span" not in http_server.requests[0].headers assert "X-Edge-Request" not in http_server.requests[0].headers
def baseplate_thrift_client(endpoint, client_spec, client_span_observer=None): baseplate = Baseplate( app_config={ "baseplate.service_name": "fancy test client", "example_service.endpoint": str(endpoint), }) if client_span_observer: class TestServerSpanObserver(ServerSpanObserver): def on_child_span_created(self, span): span.register(client_span_observer) observer = TestServerSpanObserver() class TestBaseplateObserver(BaseplateObserver): def on_server_span_created(self, context, span): span.register(observer) baseplate.register(TestBaseplateObserver()) context = baseplate.make_context_object() trace_info = TraceInfo.from_upstream(trace_id=1234, parent_id=2345, span_id=3456, flags=4567, sampled=True) baseplate.configure_context( {"example_service": ThriftClient(client_spec.Client)}) baseplate.make_server_span(context, "example_service.example", trace_info) edge_context_factory = make_edge_context_factory() edge_context = edge_context_factory.from_upstream( SERIALIZED_EDGECONTEXT_WITH_VALID_AUTH) edge_context.attach_context(context) yield context