Skip to content

Releases: twitter/finatra

Finatra 20.8.1

27 Aug 17:44
Compare
Choose a tag to compare

20.8.1

Added

  • thrift: JavaThriftRouter now allows mounting controllers by value (as opposed to via DI).
    bcc76056
  • finatra-kafka: Expose delivery timeout duration in KafkaProducerConfig. cc023430

Changed

  • inject-core: Remove deprecated com.twitter.inject.Mockito trait. Users are encouraged to
    switch to the com.twitter.mock.Mockito trait from util/util-mock. 92c3f7ba

Fixed

  • inject-server: Ensure Awaiter.any does not try to block on an empty list of Awaitables. Add
    tests. b19e8a25
  • finatra-jackson: Fix bugs around generic case class deserialization involving other generic
    types. Reported (with reproduction and pointers) on GitHub by @aatasiei
    (#547). Fixes #547. a6ba62b6
  • finatra-jackson: Fix a bug preventing JSON parsing of generic case classes, which in turn, contain
    fields with generic case classes. Reported (with a thorough reproducer and an analysis) on GitHub
    by @aatasiei (#548). Fixes #548. 0a3803ff

Finatra 20.8.0 (DO NOT USE)

12 Aug 15:59
Compare
Choose a tag to compare

20.8.0

Added

  • inject-app: Add more Java-friendly constructors for the TestInjector. 2408860e

Changed

  • inject-modules: Improve Java usability: rename apply to get for
    StatsReceiverModule and LoggerModule.
    Add get methods for other TwitterModule singleton objects.
    (BREAKING API CHANGE) 0cbbf8ab
  • inject-core: Deprecate c.t.inject.Resettable (no replacement) and c.t.inject.TestTwitterModule.
    Users should prefer the #bind[T] DSL over usage of the TestTwitterModule. f95fe7cb

Fixed

  • inject-server: Fix EmbeddedTwitterServer to return StartupTimeoutException when server under
    test fails to start within max startup time. 3eb0cd85

Finatra 20.7.0

22 Jul 17:26
Compare
Choose a tag to compare

20.7.0

Added

  • inject-app: Adding flag converters for java.io.File (including comma-separated variants).
    48429870
  • finatra-kafka-streams: Added TracingKafkaClientSupplier to provide TracingKafkaProducer and
    TracingKafkaConsumer to enable Zipkin tracing. Tracing can be enabled with the toggle
    com.twitter.finatra.kafka.TracingEnabled. fd2c5e0d
  • finatra-kafka: Added TracingKafkaProducer and TracingKafkaConsumer to enable Zipkin tracing
    for Kafka. FinagleKafkaProducerBuilder.build() and FinagleKafkaConsumerBuilder.buildClient()
    now return instances of TracingKafkaProducer and TracingKafkaConsumer respectively with
    tracing enabled by default. Tracing can be enabled with the toggle
    com.twitter.finatra.kafka.TracingEnabled. d0d8a060

Changed

  • finatra: Update org.scalatest dependency to 3.1.2 and introduce finer-grained dependencies on
    org.scalatestplus artifacts. ceccb7c5 fbb7b535

  • inject-thrift-client: Remove unused ClientId property from
    ThriftMethodBuilderClientModule#provideServicePerEndpoint method. 381853f8

  • inject-server: Improve startup time of EmbeddedTwitterServer by observing lifecycle events to
    determine startup, where previously we were doing 1 second polls. The nonInjectableServerStarted
    property is removed and isStarted should be referenced regardless of the type of underlying
    twitterServer type. The end result should see a faster test execution feedback loop. Our Finatra
    test targets range from a roughly 2x to 10x reduction in execution times.

    You may experience new test failures in cases where an exception is thrown as part of
    c.t.inject.TwitterServer.start() or c.t.server.TwitterServer.main() and the test would have
    expected a failure as part of startup. As the error takes place after the startup lifecycle,
    you may now need to Await.result the EmbeddedTwitterServer.mainResult() to assert the error.

    You may also experience some new non-deterministic behavior when testing against PubSub style
    logic. As the server may be started earlier, your tests may be relying on assumptions that
    an event would have occurred within the previous 1 second startup poll, which is no longer
    guaranteed. You may need to adjust your test logic to account for this behavior.

    a134e9b8

  • finatra: Update com.google.inject.guice dependency to 4.2.3 and net.codingwell.scala-guice
    to version 4.2.11. The net.codingwell.scala-guice library has switched from Manifests to TypeTags
    for transparent binding and injector key creation. The c.t.inject.TwitterModule has moved from its
    custom bind DSL to the scalaguice.ScalaModule which brings the TwitterModule inline with both the
    TwitterPrivateModule and the bind[T] test DSL to now have the same consistent binding DSL across
    all three. Thus, there is no more confusing bindSingleton function in the TwitterModule bind API.

    Upgrading scalaguice helps move a necessary dependency of Finatra to a version which is Scala 2.13
    compatible moving Finatra closer to Scala 2.13 support. 26c1e810 5faa2e6f

Fixed

  • inject-app: Having two sets of flag converters for primitive types (both Java and Scala) confuses
    the DI runtime, preventing the injection. We now have only a single set of converters, based off
    Scala primitive types. 9c1b0d68

Finatra 20.6.0

24 Jun 22:23
Compare
Choose a tag to compare

Added

  • inject-app: You can now inject Flag values of any type (not just primitive types). Most of the
    common Flag types are already supported out of the box (e.g., Seq[InetSocketAddress]), but it's
    also possible to register your own converters derived from any Flaggable instance.
    92a47062
  • inject-stack: Move StackTransformer from inject/inject-core to inject/inject-stack to
    remove the finagle-core dependency from inject/inject-core. 554e367e
  • inject-server: adding httpPostAdmin test method. 067b45cf

Changed

  • thrift/http: Introduce a Common Log Format
    type of formatting for Thrift access logging to replace the current prelog text. Ensure
    the HTTP and Thrift access logging filters are aligned in functionality and behavior.
    f7108618
  • inject-slf4j: Remove Jackson dependency. Case classes which wish to use the slf4j Logging
    functionality should use the finatra/jackson c.t.finatra.jackson.caseclass.SerdeLogging
    trait which provides a @JsonIgnoreProperties to ignore logging fields. 70111cd8

Finatra 20.5.0

29 May 21:27
Compare
Choose a tag to compare

Added

  • inject-mdc: Move MDC integration from inject/inject-slf4j to inject/inject-mdc.
    daf8716d
  • finatra-http|finatra-thrift: Update TraceIdMDCFilter to log traceSampled and traceSpanId
    PHAB_ID=472013
  • finatra-examples: Ensure there are Java and Scala examples for the different
    types of applications and servers which can be built with Finatra. Update /examples
    directory layout for discoverability and consistency. 2c45831c

Changed

  • inject-slf4j: Move MDC integration from inject/inject-slf4j to inject/inject-mdc.
    daf8716d
  • finatra-http: Allow extensions of the c.t.finatra.http.filters.HttpResponseFilter
    to specify how to set the Location Header value into a Response. Additionally, don't
    allow exceptions resulting from the inability to set a non-compliant 'Location' response
    header escape the filter. e827d91f
  • inject-core: Make flag methods in c.t.inject.TwitterModule public an final. 455ee6de
  • inject-core: c.t.inject.Mockito has been marked deprecated. Users are encouraged to prefer
    mockito-scala (or ScalaTest MockitoSugar
    which provides some basic syntax sugar for Mockito). 9dac0470
  • http: (BREAKING API CHANGE) Update the c.t.finatra.http.HttpResponseFilter to optionally fully
    qualify response 'Location' header values. A previous change
    made the filter always attempt to fully qualify any response 'Location' header value. This updates
    the logic to be opt-in for the more strict returning of fully qualified 'Location' header values with
    the default being to allow relative values per the RFC7231
    which replaces the obsolete RFC2616. This is
    thus a breaking API change as the default is now to allow relative values. To enable the previous
    strict behavior, users should instantiate the filter with the constructor arg fullyQualifyLocationHeader
    set to 'true'. This addresses issue #524. b6453a4d
  • jackson: Remove deprecated FinatraObjectMapper and FinatraJacksonModule. Users are encouraged
    to switch to the equivalent c.t.finatra.jackson.ScalaObjectMapper and
    c.t.finatra.jackson.modules.ScalaObjectMapperModule. 416cb346
  • finatra-http: Update c.t.finatra.http.StreamingJsonTestHelper to not use Thread.sleep for
    writing JSON elements on an artificial delay. 01fdd9cf
  • inject-app: Remove finagle-core dependency. Introduce finatra/inject/inject-dtab.
    f8f4a35e
  • finatra: Bump version of Jackson to 2.11.0. e265ba87
  • finatra-http: Only create EnrichedResponse counters when needed. Any "service/failure"
    response counters will only be generated upon first failure and not eagerly for each
    response generated. This change impacts users who expect a counter value of 0 when no
    response failures have been encountered - now the counter will not exist until the first
    failure has been recorded. b0626bd8
  • finatra: Bump version of Joda-Time to 2.10.6. f67fb7ab

Fixed

  • inject-thrift-client: Convert non-camel case ThriftMethod names, e.g., "get_tweets" to
    camelCase, e.g., "getTweets" for reflection lookup of generated ReqRepServicePerEndpoint
    interface methods in c.t.inject.thrift.filters.DarkTrafficFilter. ca538d64

Finatra 20.4.1

26 Apr 07:01
Compare
Choose a tag to compare

Added

  • inject-app: Add default type conversions for java.time.LocalTime, c.t.util.Time,
    java.net.InetSocketAddress, and c.t.util.StorageUnit. This allows the injector to convert from
    a String representation to the given type. The type conversion for java.net.InetSocketAddress
    uses the c.t.app.Flaggable.ofInetSocketAddress implementation and the type conversion for
    c.t.util.Time uses the c.t.app.Flaggable.ofTime implementation for consistency with Flag parsing.
    Because of the current state of type erasure with c.t.app.Flag instances, Finatra currently binds
    a parsed c.t.app.Flag value as a String type, relying on registered Guice TypeConverters to convert
    from the bound String type to the requested type. These conversions now allow for a c.t.app.Flag
    defined over the type to be injected by the type as Guice now has a type conversion from the bound
    String type rather than as a String representation which then must be manually converted.
    20ac122f

  • finatra-http: Method in tests to return an absolute path URI with the https scheme and authority
    ffed3815

  • finatra: Java-friendly bindClass test APIs. The bindClass API calls from Java can be
    now chained with the TestInjector, EmbeddedApp, EmbeddedTwitterServer,
    EmbeddedThriftServer, and EmbeddedHttpServer. For example, the following is now possible:

    EmbeddedHttpServer server = new EmbeddedHttpServer(
        new HelloWorldServer(),
        Collections.emptyMap(),
        Stage.DEVELOPMENT)
        .bindClass(Integer.class, Flags.named("magic.number"), 42)
        .bindClass(Integer.class, Flags.named("module.magic.number"), 9999);
    return server;
    

    e2b204a8

Changed

  • inject-app: Introduce consistent c.t.app.Flag creation methods for Java. Bring HTTP and Thrift
    server traits inline with each other to provide consistent Java support. Ensure Java examples in
    documentation. c7d8c46c

  • inject-core: Update the configuration of c.t.app.Flag instances created within a c.t.inject.TwitterModule
    to have failFastUntilParsed set to 'true' by default. While this is configurable for a given
    c.t.inject.TwitterModule, much like for the application itself, it is STRONGLY recommended that
    users adopt this behavior. e74ef0a3

  • inject-app: Update c.t.inject.app.TestInjector to always add the InjectorModule.
    6e53e77a

  • inject-app: Reduce visibility of internal code in c.t.inject.app.internal. a166dc89

  • inject-modules: Updated BUILD files for Pants 1:1:1 layout. a4fbbd19

Fixed

  • finatra-kafka: Close a result observer when Namer.resolve fails. f358993f

Finatra 20.4.0 (DO NOT USE)

02 Apr 18:29
Compare
Choose a tag to compare

Added

  • inject-app: Add Java-friendly main to EmbeddedApp. 4b40075d

  • finatra-kafka: Expose timeout duration in KafkaProducerConfig dest(). c5340a97

Changed

  • finatra-validation|jackson: (BREAKING API CHANGE) Introduced new case class validation library
    inspired by JSR-380 specification. The new library can be used as its own to validate field and
    method annotations for a case class. The library is also automatically integrated with Finatra's
    custom CaseClassDeserializer to efficiently apply per field and method validations as request
    parsing is performed. However, Users can easily turn off validation during request parsing with
    the setting noValidation in their server configurations. For more information, please checkout
    Finatra User's Guide. d874b1a9

Finatra 20.3.0

08 Mar 19:32
Compare
Choose a tag to compare

Added

  • finatra-kafka-streams: Add method to c.t.f.kafkastreams.test.TopologyTesterTopic to write
    Kafka messages with custom headers to topics. a9fef3dc

  • finatra-http: Add toBufReader to get the underlying Reader of Buf from StreamingResponse.
    If the consumed Stream primitive is not Buf, the returned reader streams a serialized
    JSON array. 876d0ba9

  • inject-app: Add functions to c.t.inject.app.AbstractApp to provide better
    ergonomics for Java users to call and use basic App lifecycle callbacks.
    f04772df

  • inject-server: Add functions to c.t.inject.server.AbstractTwitterServer to provide
    better ergonomics for Java users to call and use basic TwitterServer lifecycle
    callbacks. f04772df

  • inject-slf4j: Add a way to retrieve the currently stored Local Context map backing the
    MDC. 12b9410e

  • finatra-jackson: Added new functionality in the CaseClassDeserializer to support more
    Jackson annotations during deserialization. See documentation for more information.
    49014890

  • finatra: Add NullKafkaProducer for unit tests to avoid network connection failures in the log.
    d8d4d5db

Changed

  • finatra-validation|jackson: Remove Jackson dependency from finatra/validation. This
    was for ErrorCode reporting but can be moved to finatra/jackson. f024f929

  • finatra-kafka-streams: (BREAKING API CHANGE) Update AsyncTransformer to preserve
    record context. be5dd08f

  • finatra-jackson: Better handling of Scala enumeration mapping errors. Currently, if mapping
    of a Scala enumeration during deserialization fails a java.util.NoSuchElementException is
    thrown which escapes deserialization error handling. Update to instead handle this failure case
    in order to correctly translate into a CaseClassFieldMappingException which will be wrapped
    into a CaseClassMappingException. 4753c6e8

  • finatra: Update Google Guice version to 4.2.0 76506c35

  • finatra: Bumped version of Joda to 2.10.2 and Joda-Convert to 1.5. 9adef421

  • finatra-jackson|finatra-http-annotations: Move http-releated Jackson "injectablevalues"
    annotations from finatra/jackson to finatra/http-annotations.

    Specifically the follow have changed packages,
    c.t.finatra.request.QueryParam --> c.t.finatra.http.annotations.QueryParam
    c.t.finatra.request.RouteParam --> c.t.finatra.http.annotations.RouteParam
    c.t.finatra.request.FormParam --> c.t.finatra.http.annotations.FormParam
    c.t.finatra.request.Header --> c.t.finatra.http.annotations.Header
    c.t.finatra.request.JsonIgnoreBody --> c.t.finatra.http.annotations.JsonIgnoreBody

    Users should update from finatra/jackson/src/main/java (finatra-jackson_2.12)
    to finatra/http-annotations/src/main/java (finatra-http-annotations_2.12).
    77469e17

  • finatra-jackson: Updated Finatra Jackson integration to introduce a new ScalaObjectMapper
    and module to simplify configuration and creation of the mapper. See documentation for more
    information. 49014890

  • finatra-jackson: (BREAKING API CHANGE) Moved the java binding annotations, CamelCaseMapper and
    SnakeCaseMapper from c.t.finatra.annotations in finatra/jackson to
    c.t.finatra.json.annotations in finatra/json-annotations. Moved
    c.t.finatra.response.JsonCamelCase to c.t.finatra.json.annotations.JsonCamelCase which is also
    now deprecated. Users are encouraged to use the standard Jackson annotations or a mapper with
    the desired property naming strategy configured.

    Many exceptions for case class deserialization were meant to be internal to the framework but are
    useful or necessary outside of the internals of JSON deserialization. As such we have cleaned up
    and made most JSON deserialization exceptions public. As a result, all the exceptions have been moved
    from c.t.finatra.json.internal.caseclass.exceptions to c.t.finatra.jackson.caseclass.exceptions.

    c.t.finatra.json.internal.caseclass.exceptions.CaseClassValidationException has been renamed to
    c.t.finatra.jackson.caseclass.exceptions.CaseClassFieldMappingException. JsonInjectException,
    JsonInjectionNotSupportedException, and RequestFieldInjectionNotSupportedException have all been
    deleted and replaced with c.t.finatra.jackson.caseclass.exceptions.InjectableValuesException
    which represents the same error cases.

    The FinatraJsonMappingException has been removed. Users are encouraged to instead use the general
    Jackson JsonMappingException (which the FinatraJsonMappingException extends).

    RepeatedCommaSeparatedQueryParameterException has been moved tom finatra/http.
    49014890

Fixed

  • finatra-jackson: Access to parameter names via Java reflection is not supported in Scala 2.11.
    Added a work around for the parsing of case class structures to support JSON deserialization in
    Scala 2.11 and forward. 59ec2c21

  • finatra-jackson: Fix for enforcing "fail on unknown properties" during deserialization. Previously,
    the CaseClassDeserializer was optimized to only read the fields in the case class constructor
    from the incoming JSON and thus ignored any unknown fields during deserialization. The fix will
    now properly fail if the DeserializationFeature is set or if the JsonProperties is configured
    accordingly. 49014890

Finatra 20.1.0

29 Jan 21:24
Compare
Choose a tag to compare

Changed

  • finatra: Exposing Listening Server's bound address in Thrift and HTTP server traits
    c17f55df
  • finatra: Upgrade logback to 1.2.3 445ddf89

Fixed

  • inject-server: Fix issue in c.t.inject.server.EmbeddedHttpClient where assertion of an
    empty response body was incorrectly disallowed. This prevented asserting that a server
    was not yet healthy as the /health endpoint returns an empty string, thus even a not yet
    healthy server would report as "healthy" to the testing infrastructure as long as the health
    endpoint returned a 200 - OK response. e9aa2dac

Finatra 19.12.0

13 Dec 16:13
Compare
Choose a tag to compare

Changed

  • finatra: Upgrade to jackson 2.9.10 and jackson-databind 2.9.10.1 14fc3714

  • finatra: Correctly track Ignorable Exceptions in per-method StatsFilter. Responses
    marked as Ignorable are tracked in the global requests and exceptions metrics but
    were not counted under the per-method metrics. There are now counts of ignored
    and total requests as well as ignored requests by Exception for each method. E.g.

    per_method_stats/foo/ignored 1
    per_method_stats/foo/ignored/java.lang.Exception 1
    per_method_stats/foo/requests 1

    80946f4d

  • finatra-http|jackson (BREAKING API CHANGE): Move parsing of message body contents
    from finatra/jackson via the FinatraObjectMapper #parseMessageBody, #parseRequestBody,
    and #parseResponseBody methods to finatra/http with functionality replicated via an
    implicit which enhances a given FinatraObjectMapper. Additionally we have updated
    finatra-http the MessageBodyComponent API to use c.t.finagle.http.Message instead
    of c.t.finagle.http.Request and c.t.finagle.http.Response. This means that users can use the
    MessageBodyComponent API to read the body of Finagle HTTP requests or responses and all HTTP
    concerns are co-located in finatra-http instead of being partially implemented in finatra-jackson.

    In updating the MessageBodyComponent API we have removed support for polymorphic MessageBodyReader
    types, that is we have simplified the MessageBodyReader API to no longer express the #parse
    method parameterized to a subtype of the class type. This API allowed parsing a message body
    into a subtype solely through the presence of a given type parameter but the resulting API has
    proven to be extremely clunky. We feel that the same behavior is achievable in other ways (such
    as adapting the type after parsing) and the improvement and simplification of the
    MessageBodyReader API to be worth removing the awkward method signature.

    Lastly, we have fixed the returned charset encoding on response content-type header to be
    applicable only where appropriate instead of always being added when the
    http.response.charset.enabled flag is set to true. 4c6283b2

  • finatra: (BREAKING API CHANGE) move DarkTrafficFilter and related modules
    from finatra/thrift to inject/inject-thrift-client. The modules now extend
    from c.t.inject.thrift.modules.ThriftClientModuleTrait for more uniform configuration.
    The following changes were made:

    • c.t.finatra.thrift.filters.DarkTrafficFilter ->
      c.t.inject.thrift.filters.DarkTrafficFilter
    • c.t.finatra.thrift.modules.DarkTrafficFilterModule ->
      c.t.inject.thrift.modules.DarkTrafficFilterModule
    • c.t.finatra.thrift.modules.ReqRepDarkTrafficFilterModule ->
      c.t.inject.thrift.modules.ReqRepDarkTrafficFilterModule
    • c.t.finatra.thrift.modules.JavaDarkTrafficFilterModule ->
      c.t.inject.thrift.modules.JavaDarkTrafficFilterModule

    a8e54f34

  • finatra: Update Google Guice version to 4.1.0, update ScalaTest to 3.0.8, and ScalaCheck
    to 1.14.0. 1bc3e889

  • finatra-http: Remove deprecated c.t.finatra.http.HttpHeaders. Users should use
    com.twitter.finagle.http.Fields instead. e9e5d4e2

  • finatra-http: Remove deprecated DocRootModule. 6163e7f7

  • finatra-http: (BREAKING CHANGE) Remove automatic handling of Mustache rendering from
    finatra/http and break Mustache support into two separate libraries: finatra/mustache
    and finatra/http-mustache.

    HTTP services that want the framework to automatically negotiate Mustache template rendering
    via the Finatra HTTP MessageBodyComponents framework must now bring this concern into their
    HTTP services via the finatra/http-mustache c.t.finatra.http.modules.MustacheModule as the
    HTTP framework support for specifying a MustacheModule in the HttpServer has been removed.
    I.e., add this module to the server's list of modules.

    Additionally, it is also now possible to use Mustache templating completely independent of
    Finatra HTTP concerns by consuming and using only the finatra/mustache library which will
    render Strings via defined Mustache templates. e6aaa19f

Fixed

  • finatra-http: Fixed issue in the DefaultMessageBodyReaderImpl that determines if the incoming
    message is "json encoded". c1f1a093
  • inject-modules: Removed the extra registration for closing a client, which used to log false
    warnings when startup a ClientModule. Only register close after materialized clients.
    ddda0b12
  • inject-server: Addressed a race condition that could allow for an AdminHttpServer to be
    started, even when the disableAdminHttpServer property was set. The AdminHttpServer will
    no longer start prior to the warm-up phase if disabled. The disableAdminHttpServer property
    has also been moved to com.twitter.server.AdminHttpServer. 113b7d8
  • finatra: Remove com.sun.activation dependency from build.sbt file. The dependency
    duplicates the javax.activation dependency and as a result can cause a uber-JAR to fail
    to build. fd67b836

Added

  • finatra-jackson: (BREAKING API CHANGE) Move all Case Class annotation validation related logic to
    a new library in finatra-validation. Please update your library dependencies to the new library if
    you are using case class validations. ba5a0451